配色: 字号:
面试五
2016-03-03 | 阅:  转:  |  分享 
  
二.

1、编写一个程序,将a.txtb.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。

答:

packagecn.itcast;

importjava.io.File;

importjava.io.FileReader;

importjava.io.FileWriter;

publicclassMainClass{

publicstaticvoidmain(String[]args)throwsException{

FileManagera=newFileManager("a.txt",newchar[]{''\n''});

FileManagerb=newFileManager("b.txt",newchar[]{''\n'',''''});

FileWriterc=newFileWriter("c.txt");

StringaWord=null;

StringbWord=null;

while((aWord=a.nextWord())!=null){

c.write(aWord+"\n");

bWord=b.nextWord();

if(bWord!=null)

c.write(bWord+"\n");

}

while((bWord=b.nextWord())!=null){

c.write(bWord+"\n");

}

c.close();

}

}

classFileManager{

String[]words=null;

intpos=0;

publicFileManager(Stringfilename,char[]seperators)throwsException{

Filef=newFile(filename);

FileReaderreader=newFileReader(f);

char[]buf=newchar[(int)f.length()];

intlen=reader.read(buf);

Stringresults=newString(buf,0,len);

Stringregex=null;

if(seperators.length>1){

regex=""+seperators[0]+"|"+seperators[1];

}else{

regex=""+seperators[0];

}

words=results.split(regex);

}

publicStringnextWord(){

if(pos==words.length)

returnnull;

returnwords[pos++];

}

}

2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。

(大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!)

答:listFilesFileFilter对象,这个FileFilter,不同的人提供不同的FileFilter

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileOutputStream;

importjava.io.FilenameFilter;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.OutputStream;

publicclassJad2Java{

publicstaticvoidmain(String[]args)throwsException{

FilesrcDir=newFile("java");

if(!(srcDir.exists()&&srcDir.isDirectory()))

thrownewException("目录不存在");

File[]files=srcDir.listFiles(

newFilenameFilter(){

publicbooleanaccept(Filedir,Stringname){

returnname.endsWith(".java");

}

}

);

System.out.println(files.length);

FiledestDir=newFile("jad");

if(!destDir.exists())destDir.mkdir();

for(Filef:files){

FileInputStreamfis=newFileInputStream(f);

StringdestFileName=f.getName().replaceAll("\\.java$",".jad");

FileOutputStreamfos=newFileOutputStream(newFile(destDir,destFileName));

copy(fis,fos);

fis.close();

fos.close();

}

}

privatestaticvoidcopy(InputStreamips,OutputStreamops)throwsException{

intlen=0;

byte[]buf=newbyte[1024];

while((len=ips.read(buf))!=-1){

ops.write(buf,0,len);

}

}

}

由本题总结的思想及策略模式的解析:

1.

classjad2java{

1.?得到某个目录下的所有的java文件集合

1.1?得到目录FilesrcDir=newFile("d:\\java");

1.2?得到目录下的所有javaFile[]files=srcDir.listFiles(newMyFileFilter());

1.3?只想得到.javaclassMyFileFilterimplememytsFileFilter{

publicbooleanaccept(Filepathname){

returnpathname.getName().endsWith(".java")

}

}

2.将每个文件复制到另外一个目录,并改扩展名

2.1?得到目标目录,如果目标目录不存在,则创建之

2.2?根据源文件名得到目标文件名,注意要用正则表达式,注意.

2.3?根据表示目录的FileFile。

//要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。

2.4?将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。

//方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。

}

分析listFiles

File[]listFiles(FileFilterfilter){

File[]files=listFiles();

//ArraylistacceptedFilesList=newArrayList();

File[]acceptedFiles=newFile[files.length];

intpos=0;

for(Filefile:files){

booleanaccepted=filter.accept(file);

if(accepted){

//acceptedFilesList.add(file);

acceptedFiles[pos++]=file;

}

}

Arrays.copyOf(acceptedFiles,pos);

//return(File[])accpetedFilesList.toArray();

}

3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

答:

首先要了解中文字符有多种编码及各种编码的特征。

假设n

publicstaticvoidmain(String[]args)throwsException{

Stringstr="我aabc我爱传智def'';

Stringstr="我ABC";

intnum=trimGBK(str.getBytes("GBK"),5);

System.out.println(str.substring(0,num));

}

publicstaticinttrimGBK(byte[]buf,intn){

intnum=0;

booleanbChineseFirstHalf=false;

for(inti=0;i
{

if(buf[i]<0&&!bChineseFirstHalf){

bChineseFirstHalf=true;

}else{

num++;

bChineseFirstHalf=false;

}

}

returnnum;

}

4、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。

答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。

Stringcontent=?“中国aadf的111萨bbb菲的zz萨菲”;

HashMapmap=newHashMap();

for(inti=0;i
{

charc=content.charAt(i);

Integernum=map.get(c);

if(num==null)

num=1;

else

num=num+1;

map.put(c,num);

}

for(Map.EntrySetentry:map)

{

system.out.println(entry.getkey()+?“:”?+entry.getValue());

}

估计是当初面试的那个学员表述不清楚,问题很可能是:

如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

intengishCount;

intchineseCount;

intdigitCount;

for(inti=0;i
{

charch=str.charAt(i);

if(ch>=’0’&&ch<=’9’)

{

digitCount++

}

elseif((ch>=’a’&&ch<=’z’)||(ch>=’A’?&&ch<=’Z’))

{

engishCount++;

}

else

{

chineseCount++;

}

}

System.out.println(……………);

5、说明生活中遇到的二叉树,用java实现二叉树

这是组合设计模式。

我有很多个(10万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在某个数据,(我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后取,取出来后进行比较。平衡二叉树(构建平衡二叉树需要先排序,我们这里就不作考虑了)可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,原理如下图:

代码如下:

package?com.huawei.interview;

publicclass?Node{

publicint?value;

public?Nodeleft;

public?Noderight;

publicvoid?store(intvalue)

{

if(value
{

if(left==null)

{

left=?new?Node();

left.value=value;

}

else

{

left.store(value);

}

}

elseif(value>this.value)

{

if(right==null)

{

right=?new?Node();

right.value=value;

}

else

{

right.store(value);

}

}

}

publicboolean?find(intvalue)

{

System.out.println("happen"+this.value);

if(value==this.value)

{

returntrue;

}

elseif(value>this.value)

{

if(right==null)returnfalse;

return?right.find(value);

}else

{

if(left==null)returnfalse;

return?left.find(value);

}

}

publicvoid?preList()

{

System.out.print(this.value+",");

if(left!=null)left.preList();

if(right!=null)right.preList();

}

publicvoid?middleList()

{

if(left!=null)left.preList();

System.out.print(this.value+",");

if(right!=null)right.preList();

}

publicvoid?afterList()

{

if(left!=null)left.preList();

if(right!=null)right.preList();

System.out.print(this.value+",");

}

publicstaticvoidmain(String[]args)

{

int?[]data=newint[20];

for(inti=0;i
{

data[i]=(int)(Math.random()100)+1;

System.out.print(data[i]+",");

}

System.out.println();

Noderoot=?new?Node();

root.value=data[0];

for(inti=1;i
{

root.store(data[i]);

}

root.find(data[19]);

root.preList();

System.out.println();

root.middleList();

System.out.println();

root.afterList();

}

}

-----------------又一次临场写的代码---------------------------

importjava.util.Arrays;

importjava.util.Iterator;

publicclassNode{

privateNodeleft;

privateNoderight;

privateintvalue;

//privateintnum;

publicNode(intvalue){

this.value=value;

}

publicvoidadd(intvalue){

if(value>this.value)

{

if(right!=null)

right.add(value);

else

{

Nodenode=newNode(value);

right=node;

}

}

else{

if(left!=null)

left.add(value);

else

{

Nodenode=newNode(value);

left=node;

}

}

}

publicbooleanfind(intvalue){

if(value==this.value)returntrue;

elseif(value>this.value){

if(right==null)returnfalse;

elsereturnright.find(value);

}else{

if(left==null)returnfalse;

elsereturnleft.find(value);

}

}

publicvoiddisplay(){

System.out.println(value);

if(left!=null)left.display();

if(right!=null)right.display();

}

/publicIteratoriterator(){

}/

publicstaticvoidmain(String[]args){

int[]values=newint[8];

for(inti=0;i<8;i++){

intnum=(int)(Math.random()15);

//System.out.println(num);

//if(Arrays.binarySearch(values,num)<0)

if(!contains(values,num))

values[i]=num;

else

i--;

}

System.out.println(Arrays.toString(values));

Noderoot=newNode(values[0]);

for(inti=1;i
root.add(values[i]);

}

System.out.println(root.find(13));

root.display();

}

publicstaticbooleancontains(int[]arr,intvalue){

inti=0;

for(;i
if(arr[i]==value)returntrue;

}

returnfalse;

}

}

6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:

1,张三,28

2,李四,35

3,张三,28

4,王五,35

5,张三,28

6,李四,35

7,赵六,28

8,田七,35

程序代码如下(答题要博得用人单位的喜欢,包名用该公司,面试前就提前查好该公司的网址,如果查不到,现场问也是可以的。还要加上实现思路的注释):

package?com.huawei.interview;

import?java.io.BufferedReader;

import?java.io.IOException;

import?java.io.InputStream;

import?java.io.InputStreamReader;

import?java.util.Comparator;

import?java.util.HashMap;

import?java.util.Iterator;

import?java.util.Map;

import?java.util.TreeSet;

publicclass?GetNameTest{

/

?@paramargs

/

publicstaticvoidmain(String[]args){

//?TODO?Auto-generatedmethodstub

//InputStreamips=GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");

//用上一行注释的代码和下一行的代码都可以,因为info.txt与GetNameTest类在同一包下面,所以,可以用下面的相对路径形式

Mapresults=?new?HashMap();

InputStreamips=GetNameTest.class.getResourceAsStream("info.txt");

BufferedReaderin=?newBufferedReader(new?InputStreamReader(ips));

Stringline=?null;

try?{

while((line=in.readLine())!=null)

{

dealLine(line,results);

}

sortResults(results);

}?catch?(IOExceptione){

//?TODO?Auto-generatedcatchblock

e.printStackTrace();

}

}

staticclass?User

{

public?Stringname;

public?Integervalue;

public?User(Stringname,Integervalue)

{

this.name=name;

this.value=value;

}

@Override

publicbooleanequals(Objectobj){

//?TODO?Auto-generatedmethodstub

//下面的代码没有执行,说明往treeset中增加数据时,不会使用到equals方法。

boolean?result=super.equals(obj);

System.out.println(result);

return?result;

}

}

privatestaticvoidsortResults(Mapresults){

//?TODO?Auto-generatedmethodstub

TreeSetsortedResults=newTreeSet(

new?Comparator(){

publicintcompare(Objecto1,Objecto2){

//?TODOAuto-generatedmethodstub

Useruser1=(User)o1;

Useruser2=(User)o2;

/如果compareTo返回结果0,则认为两个对象相等,新的对象不会增加到集合中去

?所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。

/

//returnuser1.value-user2.value;

//returnuser1.value
if(user1.value
{

return?-1;

}elseif(user1.value>user2.value)

{

return?1;

}else

{

returnuser1.name.compareTo(user2.name);

}

}

}

);

Iteratoriterator=results.keySet().iterator();

while(iterator.hasNext())

{

Stringname=(String)iterator.next();

Integervalue=(Integer)results.get(name);

if(value>1)

{

sortedResults.add(newUser(name,value));

}

}

printResults(sortedResults);

}

privatestaticvoidprintResults(TreeSetsortedResults)

{

Iteratoriterator=sortedResults.iterator();

while(iterator.hasNext())

{

Useruser=(User)iterator.next();

System.out.println(user.name+":"+user.value);

}

}

publicstaticvoiddealLine(Stringline,Mapmap)

{

if(!"".equals(line.trim()))

{

String[]results=line.split(",");

if(results.length==3)

{

Stringname=results[1];

Integervalue=(Integer)map.get(name);

if(value==null)value=0;

map.put(name,value+1);

}

}

}

}



献花(0)
+1
(本文系领导love经...首藏)