论坛首页 招聘求职论坛

昨天的JAVA面试题,感觉挺难大家帮忙看看!

浏览 47364 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-05  

//2.2 求解:有一个文本文件,记录了某个学校所有人的姓名、出生日期(假设没有人重名,该校大约有2万人)。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class Test1 {
 public static void main(String[] args) {
  //
  int[][] date = new int[12][31];
  int max = 0;
  int month = 0;
  int day = 0;
  int length = 0;
  
  // read file
  try {
   String file = new String("d:\\test\\test.txt");
   BufferedReader bufferedReader =
    new BufferedReader(new InputStreamReader(new FileInputStream(file)));
   String line = bufferedReader.readLine();
   while (line != null) {
    length = line.length();
    month = Integer.parseInt(line.substring(length - 4, length - 2));
    day = Integer.parseInt(line.substring(length - 2, length - 0));
    date[month - 1][day - 1]++;
    line = bufferedReader.readLine();
   }
  } catch (Exception e) {
  }

  // display
  for (int i = 0; i < date.length; i++) {
   for (int j = 0; j < date[i].length; j++) {
    if (date[i][j] > max) {
     max = date[i][j];
     month = i + 1;
     day = j + 1;
    }
   }
  }
  System.out.println("最多人的日期是:" + month + "月" + day + "日");
 }
}

0 请登录后投票
   发表时间:2008-06-16  
对于第二题这种文本处理工作我觉得用shell更容易,一行完事,不用写这么多代码,其实很多语言工具都可以作同样的事,关键是看实际应用中哪个最合适:
cat data.txt | awk '{print $2}' | sed 's/^.\{4\}//g' | sort | uniq -c | sort -r

测试数据:
a    19800120
b    19920106
c    19970120
d    19150106
e    19380120
f    19990101

结果:人数 生日
      3 0120
      2 0106
      1 0101
0 请登录后投票
   发表时间:2008-06-16  
Underwind 写道

3,为了提高效率,必须设计一个方法 long calc(String word),该方法保证位置不同但字母相同的单词能返回同样的值,而字母不同的单词肯定返回不同的值(题目中没有明确说明是否考虑字母重复的情况,比如as和ass,故此方法也不考虑)。

   这个方法可以利用两个不同质数的乘积是唯一的这个数学特性来实现,让字母a-z对应从3开始的质数,然后取乘积。



    这样,文章中的每一个单词都有了对应的计算值,计算值相同的单词要么是重复的,要么就是anagram(变位词)。



   时间复杂度:对文章进行一次遍历。

   空间:需要与单词个数等大的辅助空间。


万一出现个超长单词:1913个字母,“色氨酸合成酶A蛋白质”(一种含有267种氨基酸酶)的化学名:

MethionylglutaminylarginyltyrosylglutamylserylleucylphenylalanylalanylglutaminylleucyllysylglutamylarginyllysylglutamylglycylalanylphenylalanylvalylprolyphenylalanYlvalythreonylleucylglycylaspartylprolylglycylisoleucylglutamylglutaminylsErylleucyllysylisoleucylaspartylthreonylleucylIsoleucylglutamylalanylglycylalanylasparthlalanylleucylglutamylleucylglycylisoleucylprolylphenylalanylseRylaspartylprolylleucylalanylaspartylglycylpRolylthreOnylisoleucylglutaminylasPfraginylalanylthreonylleucylarfinylalanylphenylalanylalanylalanylglycylvalythreonylprolylalanylglutaminylcysteinylphenylalanylglutamylmethionylleucylalanylleuOylisoleucylarginylglutaminyllysyhistidylprolylthreonylisoleucylprolylisoleucylglycylleucylmethionyltyrosylalanylasparaginylleucylvalylphenylalanylasparaginyllysyglycylisoleucylaspartylglutamylphenylalanylthrosylalanylglutaminylcysteinylglutamyllysylvalylglycylvalylaspartylserylvalylleucylvalylalnylaspartylvalylprolylvalylglUtaminylglutamylserylalanylprolylphenylalanylarginylglutaminylalanylalanylleucylarginylhistidylasparaginyvalylalanylprolylisoleucylprolylisoleucylphenylalanylisoleucylphenylalanylisoleucylcysteinylprolylprolylaspartylalanylaspartylaspartylaspartylleucylleucylarginylglutaminylisoleucylalanylseryltyrosylglycylarginylglycyltyrosylthreonyltyrOsylleucylleucylserylarginylalanylglycylvalylthreonylglycylalanylglutamYlasparainylarginylalanylalanylleucylprolylleucylasparaginylhistidylleucylValylalanyllysylleucyllysylglutamyltyrosylasparaginylalanylalanylprolylprolylleucylglutaminylglgycylphenylalanylglycylisoleucylserylalanylprolylaspartylglutaminylvalyllysylalanylalanylisoleucylaspartylalanylglycylalanylalanylglycylalanylisoleucylserylglycylserylalanylisoleucylvalyllysylisoIeucylisoleucylglutamylglutaminylHistidylasparaginyliSoleucylglutamylprolylglutamyllysylmethionylleucylalanylalanylleucyllysylvalylphenylalanylcalylglutaminylprolylmethionlysylalanylalanylthreonylarginylserine

都转化为质数乘机的话,会是相当相当大的一个数啊!所以在算乘积之前把超长单词去掉是个办法:)
0 请登录后投票
   发表时间:2008-08-29  
第二道:用map很好解决,key为月日(注意不要年),value为出现次数。变量整个文件,如果map中已经有改日的同学,就加一,如果没有加加入map,value为一。再对map的value排序。
第三道:
    第一步,先对文件转为小写
    第二步,把文件内容转为数组,String s1 = sss.split(" ");
   第三步,对数组中的每个单词排序,排序后的数组s2,如idsa 排序为adis,
   第四步,做了以上准备工作,下面就很好处理了,类似冒泡排序的方法一比较就出来了。
  
0 请登录后投票
   发表时间:2008-08-29  
第一题
public class Test{
Map<Integer,String[]> map = new HashMap<Integer,String[]>();
public Test(){
String[] s0 = {"0"};
map.put(0, s0);
String[] s1 = {"1"};
map.put(1, s1);
String[] s2 = {"a","b","c"};
map.put(2, s2);
String[] s3 = {"d","e","f"};
map.put(3, s3);
String[] s4 = {"g","h","i"};
map.put(4, s4);
String[] s5 = {"j","k","l"};
map.put(5, s5);
String[] s6 = {"m","n","o"};
map.put(6, s6);
String[] s7 = {"p","q","r","s"};
map.put(7, s7);
String[] s8 = {"t","u","v"};
map.put(8, s8);
String[] s9 = {"w","x","y","z"};
map.put(9, s9);
}
    public static void main(String[] arg){
    new Test().printNum("65967427", "");
    }
   
    public void printNum(String num,String key){
    if(num.length()==0){
    System.out.println(key);
    }else{
    String subnum = num.substring(1, num.length());
    String firstnum = num.substring(0,1);
    for(String s:map.get(Integer.valueOf(firstnum))){
    String newkey = key+s;
    printNum(subnum,newkey);
    }
    }
    }
}
0 请登录后投票
   发表时间:2008-09-19  
第一题:
import java.util.Scanner;

public class Teltest {
private char[] a0={'0'};
private char[] a1={'1'};
private char[] a2={'a','b','c'};
private char[] a3={'d','e','f'};
private char[] a4={'g','h','i'};
private char[] a5={'j','k','l'};
private char[] a6={'m','n','o'};
private char[] a7={'p','q','r','s'};
private char[] a8={'t','u','v'};
private char[] a9={'w','x','y','z'};
public char[][] m={a0,a1,a2,a3,a4,a5,a6,a7,a8,a9};
public char[][] m1;
public int[] m2;
public char[] m3;
public String istr;
public String pchar;

public void Teltest(){
        Scanner in= new Scanner(System.in);
System.out.print("请输入一串电话号码:");
String istr=in.nextLine();
m1=new char[istr.length()][];
m2=new int[istr.length()];
m3=new char[istr.length()];
pchar="";

for(int i=0;i<istr.length();i++){
m1[i]=m[istr.charAt(i)-48];
pchar=pchar+m1[i][m1[i].length-1];
m2[i]=0;
m3[i]=m1[i][m2[i]];
}
int i=0;
while(!new String(m3).equals(pchar)){
System.out.println(new String(m3));
addchar(i);
}
System.out.println(new String(m3));

}

private void addchar(int i){
if(m2[i]==m1[i].length-1){
m2[i]=0;
i=i+1;
addchar(i);
}else{
m2[i]=m2[i]+1;
}
m3[i]=m1[i][m2[i]];
}


/**
* @param args
* @throws IOException
*/
public static void main(String[] args)  {
// TODO Auto-generated method stub
Teltest t=new Teltest();
t.Teltest();
}

}
0 请登录后投票
   发表时间:2008-09-26  
用shell是一个不错的思路~哈
0 请登录后投票
   发表时间:2008-09-26  
这题目要能当场做出来,编程功底的确够厉害的哦!!看样子是专门搞算法的!
0 请登录后投票
   发表时间:2008-09-26  
第二题:
1、
Map<String,Integer> m=new HashMap<String,Integer> (366);

2、循环读取文本,一行一行的读,截取读出的字符串后四位,记位str
3、
Integer num=m.get(str);
if(num==null){
 m.put(str,1);
}else{
 m.put(str,num+1);
}



4、当文本读取完过后,把m的value中最大数对应key的取出来,key就是举行生日舞会的日期了 ,赶快去参加吧
0 请登录后投票
   发表时间:2008-09-26  
gotomyweb 写道
第二道:用map很好解决,key为月日(注意不要年),value为出现次数。变量整个文件,如果map中已经有改日的同学,就加一,如果没有加加入map,value为一。再对map的value排序。

  

  和我的想法一样啊
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics