二.
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);
}
}
}
}
|
|