Java面接宝典——アルゴリズムとプログラミング(三)

21985 ワード

二.アルゴリズムとプログラミング
1.a.txtファイルの単語とb.txtファイルの単語をc.txtファイルに交互にマージするプログラムを作成し、a.txtファイルの単語をリターンバーで区切り、b.txtファイルの単語をリターンバーまたはスペースで区切る.回答:
packagecn.itcast;
 
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
 
public class MainClass{
     public static voidmain(String[] args) throws Exception{
         FileManager a= new FileManager("a.txt",new char[]{'n'});
         FileManager b= new FileManager("b.txt",new char[]{'n',' '}); 
         FileWriter c= new FileWriter("c.txt");
         String aWord= null;
         String bWord= 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(); 
     }  
} 

class FileManager{ 
     String[] words =null;
     int pos = 0;
     publicFileManager(String filename,char[] seperators) throws Exception{
         File f = newFile(filename);
         FileReaderreader = new FileReader(f);
         char[] buf =new char[(int)f.length()];
         int len =reader.read(buf);
         Stringresults = new String(buf,0,len);
         String regex= null;
         if(seperators.length>1 ){
             regex= "" + seperators[0] + "|" + seperators[1];
         }else{
             regex= "" + seperators[0];
         } 
         words =results.split(regex);
     } 
 
     public StringnextWord(){
         if(pos ==words.length)
             returnnull;
         returnwords[pos++];
    }
} 

2、プログラムを作成し、d:javaディレクトリの下のすべてを作成する.JAvaファイルをd:jadディレクトリにコピーし、元のファイルの拡張子を.JAvaを.jad. △皆さんはこの問題をしています.ネットで遅刻した友达もこの問題をしてください.仕事を探して、これらの簡単な問題のコードを書くことができなければなりません.答:listFilesメソッドはFileFilterオブジェクトを受け入れます.このFileFilterオブジェクトは過剰なポリシーオブジェクトであり、異なる人は異なるFileFilter実装を提供し、つまり異なるフィルタポリシーを提供します.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
public class Jad2Java {
     
     public static voidmain(String[] args) throws Exception {
         File srcDir =new File("java");
         if(!(srcDir.exists()&& srcDir.isDirectory()))
             thrownew Exception("     ");
         File[] files= srcDir.listFiles(
             newFilenameFilter(){             
                 publicBoolean accept(File dir, String name) {
                     returnname.endsWith(".java");                 
                }
            }
         
         );
         
         System.out.println(files.length);
         File destDir= new File("jad");
         if(!destDir.exists())destDir.mkdir();
         for (File f:files){
             FileInputStream fis = new FileInputStream(f);
             StringdestFileName = f.getName().replaceAll("\.java$", ".jad");
             FileOutputStreamfos = new FileOutputStream(new 
                 File(destDir,destFileName));
             copy(fis,fos);
             
             fis.close();
             fos.close();             
        }  
    }
    private static voidcopy(InputStream ips,OutputStream ops) throws Exception{
         int len = 0;
         byte[] buf =new byte[1024];
         while((len =ips.read(buf)) != -1){
             ops.write(buf,0,len);             
        }
    }     
}
 

本題からまとめた思想と策略モデルの解析:1.class jad 2 java{1.あるディレクトリの下にあるすべてのjavaファイルの集合を得る1.1ディレクトリFile srcDir=newFile("d:\java");1.2ディレクトリの下にあるすべてのjavaファイルを得る:File[]files=srcDir.listFiles(new MyFileFileFilter();1.3.javaのファイルを得るだけ:class MyFileFileFilemimlememyts FileFileFile{publicboolean accept(File pathname){  returnpathname.getName().endsWith(".java")  }   }     2.各ファイルを別のディレクトリにコピーし、拡張子2.1を変更してターゲットディレクトリを取得し、ターゲットディレクトリが存在しない場合、作成する2.2ソースファイル名に基づいてターゲットファイル名を取得し、正規表現を使用することに注意する.のコマンドに対応します.2.3ディレクトリを表すFileとターゲットファイル名を示す文字列に基づいて、ターゲットファイルを表すFileを得る.//ハードディスク(HDD)でファイルを正確に作成するには、ファイル名とファイルのディレクトリを知る必要があります.2.4ソースファイルのストリームをターゲットファイルストリームにコピーし、コピー方法は独立して一つの方法となり、方法のパラメータは抽象ストリームの形式を採用する.//メソッドが受け入れるパラメータタイプは、できるだけ親に向いており、抽象的であればあるほど適応面が広くなります.}listFilesメソッド内部のポリシーパターン実装原理の解析
File[] listFiles(FileFilter filter){
     File[] files =listFiles();
     //ArraylistacceptedFilesList = new ArrayList();
     File[] acceptedFiles= new File[files.length];
     int pos = 0;
     for (File file: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が切り取るバイト数であると仮定する. 
public static void main(String[] args) throws Exception{
     String str ="  a     abc      def";
     String str ="  ABC  ";
     int num =trimGBK(str.getBytes("GBK"),5);
     System.out.println(str.substring(0,num));
 } 
 
 public static int trimGBK(byte[] buf,int n){
     int num = 0;
     booleanbChineseFirstHalf = false;
     for(inti=0;i

4、中国語文字、英語文字、数字を含む文字列があります.各文字の個数を統計して印刷してください.答:ははは、実は中国語の文字、英語の文字、数字の文字を含んで、もとは出題者の放す煙霧弾です.
String content = “   aadf  111  bbb    zz   ”;
 
HashMap map = new HashMap();
for (int i=0;i

当初面接した学生の表現がはっきりしていないと思いますが、問題は、「aaaabbc中国1512」のような文字列が英語の文字の数、中国語の文字の数、数字の文字の数をそれぞれ統計し、文字に中国語の文字、英語の文字、数字の文字以外の特殊な文字がないと仮定する場合です.
int engishCount;
int chineseCount;
int digitCount;
for (int i=0;i=’0’&& ch<=’9’) 
     {         
         digitCount++         
    }     
      elseif((ch>=’a’&& ch<=’z’) || (ch>=’A’ && ch<=’Z’))
     {         
         engishCount++;         
    }else 
     {         
         chineseCount++;         
    }     
}
System.out.println(……………);

5、生活の中で出会った二叉木を説明し、javaで二叉木を実現するのが組み合わせ設計モードである.私はたくさんの(仮に10万個)データを保存しなければならないので、後で保存したデータの中からあるデータが存在するかどうかを検索する必要があります.(二叉木のメリットを言いたいのですが、どう言えばいいのでしょうか.それは他人の欠点です)、配列の中にあると、たまたま探している数字が999999の場所にあると、検索のスピードが遅くなります.1つ目から順に後ろに取るので、取り出して比較します.バランスツリー(バランスツリーを構築するには先にソートする必要がありますが、ここでは考慮しません)はこの問題をうまく解決できますが、ツリーの遍歴(前シーケンス、中シーケンス、後シーケンス)の効率は配列よりずっと低く、原理は以下の図の通りです.
package com.huawei.interview;
 
publicclass Node {
     public int value;
     public Node left;
     public Node right;
     
     public void store(intvalue)
     {         
         if(valuethis.value)
         {             
             if(right ==null) 
             {                 
                 right = new Node();
                 right.value=value;                 
            } else
             {                 
                 right.store(value);                 
            }
        }
    }
    public Boolean find(intvalue)
    {
         System.out.println("happen" +this.value);
         if(value ==this.value)
         {             
             return true;
        }
          else if(value>this.value)
         {             
             if(right ==null)return false;             
             return right.find(value);             
        } else
         {             
             if(left ==null)returnfalse;             
             return left.find(value);             
        }
    }
     public void preList()
     {         
         System.out.print(this.value+ ",");
         if(left!=null)left.preList();
         if(right!=null) right.preList();         
    }
     public void middleList()
     {         
         if(left!=null)left.preList();
         System.out.print(this.value+ ",");
         if(right!=null)right.preList();
    }     
     public void afterList()
     { 
         if(left!=null)left.preList();
         if(right!=null)right.preList();
         System.out.print(this.value+ ",");
    }
     public static voidmain(String [] args)
     {         
         int [] data =new int[20];
         for (inti=0;i

------------------------------------------------------------
importjava.util.Arrays;
importjava.util.Iterator;
 
public class Node{
     private Node left;
     private Node right;
     private int value;
     //private int num;
     
     public Node(int value){
         this.value = value;         
    }     
     public void add(int value){         
         if(value > this.value)
         {             
             if(right != null)
             right.add(value);
              else 
             {                 
                 Node node = new Node(value);                 
                 right = node;                 
            }
        }         
         else{
             if(left != null)
             left.add(value);
              else 
             {                 
                 Node node = new Node(value);                 
                 left = node;
            }
        }
    }
     public Boolean find(int value){
         if(value == this.value) return true;
          else if(value > this.value){
             if(right == null) return false;
              else return right.find(value);             
        } else{
             if(left == null) return false;
              else return left.find(value);
        }
    }
     public void display(){
         System.out.println(value);
         if(left != null) left.display();
         if(right != null) right.display(); 
    }
    /*public Iterator iterator(){
 
 }*/     
     public static void main(String[] args){
         int[] values = new int[8];
         for (int i=0;i<8;i++){
             int num = (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));         
         Node root = new Node(values[0]);
         for (int i=1;i

6、以下のようなテキストファイルからすべての名前を読み取り、印刷し、繰り返しの名前と繰り返しの回数を並べ替えます.1、張三、28 2、李四、35 3、張三、28 4、王五、35 5、張三、28 6、李四、35 7、趙六、28、田七、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
     */
     public static voidmain(String[] args) {
         // TODO Auto-generated method stub
         //InputStream ips =GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");
         //                   ,   info.txt   GetNameTest   
             ,  ,            
         
         Map results = new HashMap();
         InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");
         BufferedReader in = newBufferedReader(new InputStreamReader(ips));
         String line = null;         
         try {             
             while((line=in.readLine())!=null) 
             {                 
                 dealLine(line,results);
            }
             sortResults(results);
        }
        catch (IOException e) {
             // TODO Auto-generated catchblock
             e.printStackTrace();
        }
    }
     static class User
     {         
         public String name;
         public Integer value;
         public User(String name,Integervalue)
         {             
             this.name = name;
             this.value = value;             
        }
         @Override
         public booleanequals(Object obj) {
             // TODO Auto-generated methodstub
             
             //         ,    treeset       ,      equals  
             。
             Boolean result =super.equals(obj);
             System.out.println(result);
             return result;             
        }
    }
     private static voidsortResults(Map results) {
         // TODO Auto-generated method stub
         TreeSet sortedResults =newTreeSet(
         new Comparator(){
             public intcompare(Object o1, Object o2) {
                 // TODOAuto-generated method stub
                 User user1 = (User)o1;
                 User user2 = (User)o2;                 
                /*   compareTo     0,         ,     
        
 *   ,          ,  ,           
      。
 * */
                 
                 //returnuser1.value-user2.value;                 
                //returnuser1.valueuser2.value)
                 {                     
                     return 1;                     
                } else
                 {                     
                     returnuser1.name.compareTo(user2.name);
                }
            }
        }         
         );
         Iterator iterator =results.keySet().iterator();
         while(iterator.hasNext())
         {             
             String name = (String)iterator.next();
             Integer value =(Integer)results.get(name);
             if(value > 1)
             {                 
                 sortedResults.add(newUser(name,value));
            }
        }
         printResults(sortedResults);         
    }     
     private static voidprintResults(TreeSet sortedResults)
     {         
         Iterator iterator = sortedResults.iterator();
         while(iterator.hasNext())
         {             
             User user = (User)iterator.next();
             System.out.println(user.name +":" + user.value);             
        }
    }     
     public static voiddealLine(String line,Map map)
     {         
         if(!"".equals(line.trim()))
         {             
             String [] results =line.split(",");
             if(results.length == 3)
             {                 
                 String name = results[1];
                 Integer value =(Integer)map.get(name);
                 if(value ==null)value = 0;
                 map.put(name,value + 1);                 
            }
        }
    }
}
 

7、Singletonを書いてください.1つ目:満腹モード
public classSingleTon {
     private SingleTon(){
     } 
 
     //                     ,          
     private final static SingleTon instance =new SingleTon();
     public static SingleTon getInstance(){
         return instance;
     } 
} 

2つ目:飢餓モード
public classSingleTon {
     private SingleTon(){} 
     private static instance = null;//newSingleTon();
 
     public static synchronized SingleTongetInstance(){
         if(instance == null)
             instance = new SingleTon();
         return instance;
     } 
} 

3つ目:列挙
public enum SingleTon{
     ONE;
 
 } 

第三:より現実的な応用(どのような状況で単例を使うか)
public classSequenceGenerator{
     //              
     private int count = 0; 
     public synchronized int getSequence(){
         ++count;
     }  
     //             
     private SequenceGenerator(){}
     private final static instance = newSequenceGenerator();
     public static SingleTon getInstance(){
         return instance;
     } 
} 

4番目:
public class MemoryDao
 { 
     private HashMap map = new HashMap(); 
     publicvoid add(Student stu1){
         map.put(SequenceGenerator.getInstance().getSequence(),stu1);
     }  
     //  MemoryDao     
 } 

Singletonモードの主な役割は、JavaアプリケーションでクラスClassが1つのインスタンスしか存在しないことを保証することです.一般的なSingletonモードには通常いくつかの形式があります.第1の形式:クラスを定義し、その構造関数はprivateであり、staticのprivateのクラス変数があり、クラスの初期化時にインスタンス化すると、publicのgetInstanceメソッドでその参照を取得し、そのメソッドを呼び出します.
public class Singleton {
private Singleton(){}
     //             ,      ?
     //     private       
     private staticSingleton instance = new Singleton();
     //              class      ,       
     public staticSingleton getInstance() {
         return instance;
     } 
 } 

2つ目の形式:
public class Singleton {
    private static Singleton instance = null;
    public static synchronized Singleton getInstance() {
        //           ,           ,      
        //       ,     !
        if (instance==null)
            instance=new Singleton();
         return instance;
     } 
} 

その他の形式:クラスを定義します.その構造関数はprivateで、すべての方法はstaticです.第一の形式はもっと安全だと思われています
8、再帰アルゴリズムの問題1つの整数、0より大きくて、循環とローカル変数を使わないで、n,2 n,4 n,8 nの順序で増加して、値が5000より大きい時、値を指定の順序で出力します.例:n=12327の出力は:123724744948969896494824741237で、ヒント:プログラムを書くときは、まず増加方式のコードに感謝し、増加を書いた後、考慮の減少部分を増やす. 
public static void doubleNum(int n)
 { 
     System.out.println(n);
     if(n<=5000)
         doubleNum(n*2);
     System.out.println(n); 
 } 
Gaibaota(N) = Gaibaota(N-1) + n

9、再帰アルゴリズムの問題2第1人10、第2人は第1人より2歳大きくて、順番に押して、再帰方式で第8人の大きさを計算してください.
package cn.itcast;
 
import java.util.Date;
 
publicclass A1 { 
    public static voidmain(String [] args)
    { 
        System.out.println(computeAge(8));
    } 
 
    public static int computeAge(intn)
    { 
        if(n==1)return 10;
        returncomputeAge(n-1) + 2;
    } 
} 
 
public static voidtoBinary(int n,StringBuffer result)
{  
    if(n/2 != 0)
    toBinary(n/2,result);
    result.append(n%2); 
} 

10、並べ替えにはどんな方法がありますか.列挙してください.JAVAでクイックソートを実現.バブルソート、選択ソート、およびクイックソートのみを検討しました.次はクイックソートのコードです.
public class QuickSort {
    /**
    *     
    * @param strDate
    * @param left
    * @param right
    */
    public void quickSort(String[] strDate,int left,int right){
        String middle,tempDate;
        int i,j;
        i=left;
        j=right;
        middle=strDate[(i+j)/2];
        do{
            while(strDate[i].compareTo(middle)<0&& i0&& j>left)
            j--;
            //           
            if(i<=j){
                //                
                tempDate=strDate[i];
                strDate[i]=strDate[j];
                strDate[j]=tempDate;
                i++;
                j--;                 
            }             
        }
        while(i<=j);
        //        
        if(ileft){
            quickSort(strDate,left,j);
        }         
    }
     
    /**
     * @param args
     */
    public static void main(String[] args){
        String[] strVoid=newString[]{"11","66","22","0","55","22","0","32"};
        QuickSort sort=new QuickSort();
        sort.quickSort(strVoid,0,strVoid.length-1);
        for (int i=0;i

11、配列a[n]があり、javaコードで配列要素を順番に逆さまにする//以下のものでも//for(inti=0、int j=a.length-1;i
importjava.util.Arrays;
 
public classSwapDemo{     
     public static void main(String[] args){
         int [] a = new int[]{
             (int)(Math.random() *1000),
             (int)(Math.random() * 1000),
             (int)(Math.random() *1000),
             (int)(Math.random() *1000), 
             (int)(Math.random() * 1000)          
        }
        ; 
         System.out.println(a);
         System.out.println(Arrays.toString(a));
         swap(a);
         System.out.println(Arrays.toString(a));
    }
     public static void swap(int a[]){
         int len = a.length;
         for (int i=0;i

12.金額変換、アラビア数字の金額を中国の伝統的な形式に変換する:(¥1011)->(千一拾一元整)出力.ゼロ除去コード:returnsb.reverse().toString().replaceAll("零[拾佰仟],"零").replaceAll(「ゼロ+万」,「万」).replaceAll("0+元","元").replaceAll(「ゼロ+」、「ゼロ」); 
public class RenMingBi {
    /**
     * @param args add by zxx ,Nov 29, 2008
     */
     private static finalchar[] data = new char[]{
         ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ' 
     };
     private static finalchar[] units = new char[]{
         ' ',' ',' ',' ',' ',' ',' ',' ',' ' 
     };
     public static voidmain(String[] args) {
         // TODOAuto-generated method stub
         System.out.println(
         convert(135689123));         
    }
     public static Stringconvert(int money)
     {         
         StringBuffersbf = new StringBuffer();
         int unit = 0;
         while(money!=0)
         {             
             sbf.insert(0,units[unit++]);
             intnumber = money%10;
             sbf.insert(0,data[number]);
             money/= 10;             
        }
        returnsbf.toString();         
    }     
}
 

 
 
------------------------------------------------------------------------------
下一篇:Java面接の宝典
上一篇:Java面接宝典——html&JavaScript&ajax部分(四)
------------------------------------------------------------------------------