(全)面试 面试软件开发工程师 算法题 含答案.docx
面试面试软件开发工程师算法题含答案1 .编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。答:packagecn.itcast;importjava.io.File;importjava.io.FileReader;importjava.io.FiIeWriter;publicclassMainClasspublicstaticvoidmain(Stringargs)throwsExceptionFiIeManagera=newFileManager(na.txtnznewchar'n');FiIeManagerb=newFileManager("b.txtnewchar,n'/');FiIeWriterc=newFileWriter("c.txt");StringaWord=null;StringbWord=null;while(aWord=a.nextWord()!=null)c.write(aWord+,");bWord=b.nextWord();if(bWord!=null)c.write(bWord+"n");)while(bWord=b.nextWord()!=null)c.write(bWord+,");)c.close();)classFileManagerStringwords=null;intpos=0;publicFileManager(Strigfilenamezcharseperators)throwsExceptionFilef=newFile(filename);FiIeReaderreader=newFileReader(f);charbuf=newchar(int)f.length();intIen=reader.read(buf);Stringresults=newString(bufzOJen);Stringregex=null;if(seperators.length>1)regex=nn+seperators0+nn+seperatorsl;elseregex=nn+seperators0;words=results.split(regex);)publicStringnextWord()if(pos=words.length)returnnull;returnwordspos+;)2 .编写一个程序,将d:java目录下的所有JaVa文件复制到d:jad目录下,并将原来文件的扩展名从JaVa改为Jad.(大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!)答:IistFiIes方法接受一个FiIeFiIter对象,这个FiIeFiIter对象就是过虑的策略对象,不同的人提供不同的FiIeFiIter实现,即提供了不同的过滤策略。importjava.io.File;importjava.io.FilelnputStream;importjava.io.FileOutputStream;importjava.io.FiIenameFiIter;importjava.io.IOE×ception;importjava.io.InputStream;importjava.io.OutputStream;publicclassJad2Javapublicstaticvoidmain(Stringargs)throwsExceptionFilesrcDir=newFile(',java");if(!(srcDir.exists()&&SrcDirJsDirectoryO)thrownewEXCePtion("目录不存在”);Filefiles=srcDir.listFiles(newFilenameFilter()publicbooleanaccept(FiledirzStringname)returnname.endsWith(,.java"););System.out.println(files.length);FiledestDir=newFile(',jadn);if(!destDir.exists()destDir.mkdir();for(Filefiles)FiIeInputStreamfis=newFileInputStream(f);StringdestFiIeName=f.getName().replaceAII(',.javaS"z',.jad");FileoutputStreamfos=newFileOutputStream(newFile(destDirzdestFileName);copy(fiszfos);fis.close();fos.close();privatestaticvoidcopy(InputStreamipszOutputStreamops)throwsExceptionintIen=0;bytebuf=newbyte1024;while(len=ips.read(buf)!=-1)ops.write(bufzOJe);)由本题总结的思想及策略模式的解析:1.classjad2java1 .得到某个目录下的所有的java文件集合1.1 得到目录FilesrcDir=newFile("d:javan);1.2 得到目录下的所有java文件:Filefiles=srcDir.listFiles(newMyFiIeFiIterQ);1.3 只想得到JaVa的文件:classMyFiIeFiIterimpIememytsFileFilterpublicbooleanaccept(Filepathname)returnpathname.getName().endsWith(,.java")2,将每个文件复制到另外一个目录,并改扩展名2.1 得到目标目录,如果目标目录不存在,则创建之2.2 根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。2.3 根据表示目录的FiIe和目标文件名的字符串,得到表示目标文件的Fileo要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。2.4 将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。)分析IiStFileS方法内部的策略模式实现原理FilelistFiles(FileFilterfilter)Filefiles=IistFiIesO;/ArraylistacceptedFiIesList=newArrayList();FileacceptedFiles=newFiIeffiIesJength;intpos=0;for(Filefile:files)booleanaccepted=filter.accept(file);if(accepted)/acceptedFilesList.add(file);acceptedFilespos+=file;Arrays.copyOf(acceptedFileszpos);/retur(File)accpetedFilesList.toArray();)3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如我ABC”,4,应该截取我AB”,输入我ABC汉DEF,6,应该输出我ABU,而不是我ABC+汉的半个。答:首先要了解中文字符有多种编码及各种编码的特征。假设n为要截取的字节数。publicstaticvoidmain(Stringargs)throwsExceptionStringstr="我a爱中华abc我爱传智def;StringStr="我ABC汉”;intnum=trimGBK(str.getBytes("GBK"),5);System.outprintln(str.substring(Oznum);publicStaticinttrimGBK(bytebufzintn)intnum=O;booleanbChineseFirstHalf=false;for(inti=0;i<n;i+)(if(bufi<0&&!bChineseFirstHalf)bChineseFirstHalf=true;elsenum+;bChineseFirstHalf=false;)returnnum;4.有一个字符串,其中包含中文字符.英文字符和数字字符,请统计和打印出各个字符的个数。答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的烟雾弹。Stringcontent=中国aadf的Ill萨bbb菲的zz萨菲”;HashMapmap=newHashMapO;for(inti=0;i<content.length;i+)(charc=contentcharAt(i);Integernum=map.get(c);if(num=null)num=1;elsenum=num÷1;map.put(cznum);for(Map.EntrySetentry:map)system.out.println(entry.getkey()+entry.getValue();)估计是当初面试的那个学员表述不清楚,问题很可能是:如果一串字符如匕aaabbc中国1512”要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。intengishCount;intChineseCount;intdigitCount;for(inti=O;i<str.length;i+)(charch=str.charAt(i);if(ch>=z0,&&ch<=z9')digitCount+)elseif(ch>=xa,&&ch<=fz')(ch>='A'&&ch<='T)(engishCount+;)else(ChineseCount+;)System.out.println();5、说明生活中遇到的二叉树,用java实现二叉树这是组合设计模式。我有很多个(假设10万个)数据要保存起来,以后还需要从保存的这些数据中检索是否存在某个数据,(我想说出二叉树的好处,该怎么说呢?那就是说别人的缺点),假如存在数组中,那么,碰巧要找的数字位于99999那个地方,那查找的速度将很慢,因为要从第1个依次往后取,取出来后进行比较。平衡二叉树(构建平衡二叉树需要先排序,我们这里就不作考虑了)可以很好地解决这个问题,但二叉树的遍历(前序,中序,后序)效率要比数组低很多,原理如下图:代码如下:packagecom.huawei.interview;publicclassNodepublicintvalue;publicNodeleft;publicNoderight;publicvoidstore(intvalue)if(value<this.value)left=newNode();IeftvaIue=VaIue;else(left.store(value);)elseif(value>this.value)(if(right=null)right=newNode();right.value=value;)else(right.store(value);)publicbooleanfind(intvalue)(System.out.println("happen+this.value);if(value=this.value)(returntrue;elseif(value>this.value)if(right=null)returnfalse;returnright.find(value);else(讦(Ieft=null)returnfalse;returnleft.find(value);)publicvoidpreList()(System.out.print(this.value+if(left!=null)left.preList();讦(right!=nuH)right.preList();publicvoidmiddleList()(if(left!=null)left.preList();System.out.print(this.value+讦(right!=null)right.preList();)publicvoidafterList()(if(left!=null)left.preList();if(right!=null)right.preList();System.out.print(this.value+)publicstaticvoidmain(Stringargs)intdata=newint20;for(inti=0;i<data.length;!+)(datai=(int)(Math.random()*100)+1;System.outprint(datai+,'z");)System.outprintln();Noderoot=newNode();root.value=data0;for(inti=l;i<data.length;!+)(root.store(datai);)root.find(data19);root.preList();System.out.println();root.middleList();System.out.println();root.afterList();)又一次临场写的代码importjava.UtiLArrays;importjava.UtiLIterator;publicclassNodeprivateNodeleft;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;)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);if(left=null)returnfalse;elsereturnleft.find(value);)publicvoiddisplay()System.outprintln(value);if(left!=null)left.display();if(right!=null)rightdisplay();)*publicIteratoriterator()*/publicstaticvoidmain(Stringargs)intvalues=newint8;for(inti=0;i<8;i+)intnum=(int)(Math.random()*15);/System.out.printl(num);/if(Arrays.binarySearch(valuesznum)<O)if(!contais(valuesznum)valuesi=num;elsei-;)System.outprintln(Arrays.toString(values);Noderoot=newNode(values0);for(inti=l;i<VaIuesJengthj+)root.add(valuesi);)System.outprintln(root.find(13);root.display();publicstaticbooleancontains(intarrjntvalue)inti=0;for(;i<arr.length;i+)if(arri=value)returntrue;)returnfalse;)