Java面試題代碼篇

1.統計字符串中的各類字符的個數並對其排序java

package JavaMianSiTest;



public class TongJIZiFu {

    public static void main(String[] args)  
    {  
        String str = "a12中國3@b&4語*$#@^&言3c";  
  
        String E1 = "[\u4e00-\u9fa5]";// 中文  
        String E2 = "[a-zA-Z]";// 英文  
        String E3 = "[0-9]";// 數字  
  
        int chineseCount = 0;  
        int englishCount = 0;  
        int numberCount = 0;  
  
        String temp;  
        for (int i = 0; i < str.length(); i++)  
        {  
            temp = String.valueOf(str.charAt(i));  
            if (temp.matches(E1))  
            {  
                chineseCount++;  
            }  
            if (temp.matches(E2))  
            {  
                englishCount++;  
            }  
            if (temp.matches(E3))  
            {  
                numberCount++;  
            }  
        }  
        System.out.println("漢字數:" + chineseCount);  
        System.out.println("英文數:" + englishCount);  
        System.out.println("數字數:" + numberCount);  
        System.out.println("特殊字符:" + (str.length() - (chineseCount + englishCount + numberCount)));  
    }  
}
View Code

2.文件合併git

package JavaMianSiTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

/**
 * 一、編寫一個程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合併到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進行分隔
 *
 */
public class WenjianHebing {


public static void main(String[] args) throws IOException {


File fileA= new File("D:/eclipse項目/a.txt");
Reader readerA = new FileReader(fileA); 

//建立能夠一次讀取一行的輸入流
BufferedReader a = new BufferedReader(readerA);   //一次讀取一行,結束符爲null

File fileB= new File("D:/eclipse項目/b.txt");
Reader readerB = new FileReader(fileB); 
BufferedReader b = new BufferedReader(readerB);   //一次讀取一行,結束符爲null

String str1=a.readLine();

//用於單詞的計數
int wordsA=0;
//緩衝區,能夠把讀取的單詞存進去
StringBuffer bufA= new StringBuffer();
while(str1!=null){   
System.out.println("***********"+str1);
str1=a.readLine();
wordsA++;
if(str1!=null)
bufA.append(str1);
bufA.append(" ");

}
System.out.println("a.txt單詞數:"+wordsA);
System.out.println("-------------------------");

String str2=b.readLine();
int wordsB=0;
StringBuffer bufB= new StringBuffer();
while(str2!=null){     
String[] st = str2.split(" ");  //例如讀取的一行爲:house home desk
        wordsB+=st.length;
        for(String i :st){
        bufB.append(i);     //把切割後的字符放到b的緩衝區
        bufB.append(" ");
        
        }
System.out.println(str2);
str2=b.readLine();
}
System.out.println("b.txt單詞數:"+wordsB);

System.out.println("A文件:"+bufA);
System.out.println("B文件:"+bufB);

String strA=bufA.toString();  //轉爲字符串
String strB=bufB.toString();

String []A=strA.split(" ");
String []B=strB.split(" ");
int total=wordsA+wordsB;
String [] result=new String [total-1];  //建立一個字符串數組,能夠容納a.txt以及b.txt的單詞的總數
if(wordsA<wordsB)//只作了a文件的單詞數比b的少的,後面加個else就能夠了
{
int j=0;  
for(int i=0;i<wordsB;i++)
{
result[j]=B[i];
j++;
if(i<A.length)
{
result[j]=A[i];
j++;
}



}
}
String content ="";
     for(String x:result){
    content+=x+" "; //把字符數組的內容轉爲字符串
     }
    System.out.println("content:"+content);
     
  File fileC = new File("D:/eclipse項目/c.txt");
    Writer w = new FileWriter(fileC);
    w.write(content);  //把字符串寫到c.txt裏去
  
  w.close();     //必定要關閉,否則沒法成功的
  
    


 }

}
View Code

3.金額轉換正則表達式

package JavaMianSiTest;
/*
 * 金額轉換,阿拉伯數字的金額轉換成中國傳統的形式
 */
public class RenMingBi {
    public static String convert(double inputMonney) {  
        int decimalDigit = 2;//人名幣保留2位小數到分  
        //漢語中數字大寫  
        char[] data = {'零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'};   
        //漢語中貨幣單位大寫,這樣的設計相似於佔位符  
        char[] units = {'分', '角', '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '億', '拾', '佰', '仟','兆', '拾', '佰', '仟'};  
        int uint = 0;  
        //在這裏我不使用系統函數,本身實現四捨五入,原理:如102.345,保留2位並四捨五入,102.3456->102.3456*10^(2+1)=102345.6->去掉小數部分102345->102345%10=5取到保留小數位數的下一位數字,判斷舍入  
        long money = (long)(inputMonney * Math.pow(10, decimalDigit + 1));  
        if (money % 10 > 4) {  
            money = (money / 10) + 1;  
        } else {  
            money = money / 10;  
        }  
        StringBuffer sbf = new StringBuffer();  
        while (money != 0) {  
            sbf.insert(0, units[uint++]);//插入人名幣單位  
            sbf.insert(0, data[(int) (money % 10)]);//插入單位所對應的值  
            money = money / 10;  
        }  
        //使用replaceAll替換掉「零+'人民幣單位'」,replaceAll裏面的old字符串能夠是正則表達式  
        return sbf.toString().replaceAll("零[仟佰拾]", "零").replaceAll("零+萬", "萬").replaceAll("零+億", "億").replaceAll("億萬", "億零").replaceAll("零+", "零").replaceAll("零元", "元").replaceAll("零[角分]", "");  
    }  
    
    public static void main(String[] args) {
        System.out.println(convert(25936.36));
        
    }
}
View Code

4.二叉樹設計模式

package JavaMianSiTest;

/** 
 * 說明生活中遇到的二叉樹,用 java 實現二叉樹 。 
    這是組合設計模式。  
    我有不少個(假設 10 萬個)數據要保存起來,之後還須要從保存的這些數據中檢索是否存在 
    某個數據, (我想說出二叉樹的好處, 該怎麼說呢?那就是說別人的缺點) , 假如存在數組中, 
    那麼,碰巧要找的數字位於 99999那個地方,那查找的速度將很慢,由於要從第 1 個依次往 67 
    後取,取出來後進行比較。平衡二叉樹(構建平衡二叉樹須要先排序,咱們這裏就不做考慮 
    了)能夠很好地解決這個問題,但二叉樹的遍歷(前序,中序,後序)效率要比數組低不少, 
 
 * store(int value)能夠選擇二叉樹中是否能夠存在相同的值 
 */  
  
  
  
//Node,準確的說,是樹(包括子樹)的根節點  
public class ErChashuTest{  
    public int value;  
    public ErChashuTest left;  
    public ErChashuTest right;  
    //這種存儲方式,是:往已經存在的節點的左右子節點上尋找插入點,而不是考慮做爲已經存在的節點的父節點,會形成二叉樹的不平衡  
    public void store(int value){  
        if(value<this.value){  
            if(left==null){  
                left = new ErChashuTest();  
                left.value=value;  
            }else{  
                left.store(value);  
            }  
        }else if(value>this.value){  
            if(right==null){  
                right = new ErChashuTest();  
                right.value=value;  
            }else{  
                right.store(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.middleList();  
        System.out.print(this.value+",");  
        if(right!=null)right.middleList();  
    } 
    //後序遍歷
    public void afterList(){  
          
        if(left!=null)left.afterList();       
        if(right!=null)right.afterList();  
        System.out.print(this.value+",");  
    }  
      
      
    public static void main(String [] args){  
        int[] data = new int[20];  
        for(int i=0; i<data.length; i++){  
            data[i] = (int)(Math.random()*100)+1;//0+1<<x*100+1<<1*100+1  
            System.out.print(data[i]+",");  
        }  
        System.out.println();  
        ErChashuTest root = new ErChashuTest();  
        root.value = data[0];  
        for(int i=1; i<data.length; i++){  
            root.store(data[i]);  
        }  
        root.preList();  
        System.out.println();  
        root.middleList();  
        System.out.println();  
        root.afterList();  
          
    }  
      
}  
View Code

5.對文件中的姓名的重複次數進行排序數組

package JavaMianSiTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;

/*
 * 從類試以下文本文件中讀取全部的姓名,並打印出重複的姓名和重複的次數
 * 並按重複次數排序
 * 
 */

public class ChongFuSort {

    
      /** 
     * ①讀取文件到字符串 
     * ②按照換行分割成字符串數組 
     * ③遍歷字符串數組,取出姓名 
     * ④將姓名和出現的次數存入map中; 
     * ⑤利用 treeset整理結果;爲此須要封裝User,其中包含了name,以及count;須要在User 中實現comparable接口或者構造 treesetmap時傳入comparator; 
     * 
     * @throws Exception 
     */  
      
    static class User /*implements Comparable<User>*/ {  
         String name;  
          int count ;  
          public User(String name, int count) {  
              super();  
              this.name = name;  
              this.count = count;  
         }  
          @Override  
          public String toString() {  
              return "User [name=" + name + ", count=" + count + "]" ;  
         }  
           
          /** 
          * 方法一。使用comparable接口來進行排序; 
          */  
//       @Override  
//       public int compareTo(User o) {  
//           if(this.count>o.count)return -1;  
//           if(this.count<o.count)return 1;  
//             
//           return this.name.compareTo(o.name);  
//             
//            return this.count>o.count?1:(this.count<o.count?-1:this.name.compareTo(o.name));  
//             
//       }  
           
    }  
      
    public static void main(String[] args) throws Exception {  
          //讀取文件;  
         File file= new File("D:/eclipse項目/a.txt" );  
         FileReader fr=new FileReader(file);  
          int fileSize=(int) file.length();  
          char[] buff=new char[fileSize];  
           
          //用來存放名字和對應的次數;  
         Map<String, Integer> map= new HashMap<String, Integer>();  
           
          //安裝次數由小到大排序後的結果;傳入比較器,使用comparator來比較;這樣元素再加入的時候就會調用比較方法,按照默認升序排列  
         Set<User> sortedResult= new TreeSet<User>(new Comparator<User>() {  
 
              public int compare(User o1, User o2) {  
//                if(o1.count>o2.count)return -1;//默認是從小到大排列  
//                if(o1.count<o2.count)return 1;  
//                return o1.name.compareTo(o2.name);  
                   //更簡潔的寫法  
                   return o1.count >o2.count ? 1:(o1.count<o2.count ?-1:o1.name .compareTo(o2.name));  
             }  
         });  
           
          int len=fr.read(buff);//獲得讀取的字符個數;  
         String result= new String(buff,0,len);  
           
         String[] strings = result.split( "\\s+");  
          //將姓名提取出來;並將姓名和出現的次數放入到集合中;  
          for (String string : strings) {  
             string= new String(string.getBytes(),"gbk" );//1,張三,28(解決亂碼)  
             System. out.println(string);  
               
             String[] strings2 = string.split( ",");  
             String name=strings2[0];  
            //存入姓名以及對應的次數  
             Integer count=map.get(name);  
              if(count==null ){  
                  map.put(name, 1);  
             } else{  
                  map.put(name, count+1);  
             }  
         }  
          //遍歷map,獲得全部的entry集合,封裝成user,加入到set集合中;  
         Set<Map.Entry<String, Integer>> entrySet = map.entrySet();  
         Iterator<Entry<String, Integer>> iterator = entrySet.iterator();  
           
          while(iterator.hasNext()){  
             Entry<String, Integer> entry = iterator.next();  
              System. out.println(entry.getKey()+":" +entry.getValue()+"次");  
             User user= new User(entry.getKey(), entry.getValue());  
             sortedResult.add(user); //在加入數據時,自動安裝 compareto定義的進行排序;  
               
         }  
          //遍歷整理好的set,從小到大升序排列  
         Iterator<User> it = sortedResult.iterator();  
          while(it.hasNext()){  
             User user=it.next();  
             System. out.println(user);  
         }  
    }  

}
View Code

6.遞歸排序app

package org.sbj.sort;

import java.util.Arrays;

public class SortTest {
    /*
     * 快速排序(遞歸排序)
     * @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&&i<right)
            i++;//找出左邊比中間值大的數
        while(strDate[j].compareTo(middle)>0&&j>left)
            j--;//找出右邊比中間值小的數
        if(i<=j) {//將左邊大的數和右邊曉得數進行替黃
            tempDate=strDate[i];
            strDate[i]=strDate[j];
            strDate[j]=tempDate;
            i++;
            j--;
        }
        
    }while(i<=j);//當二者交錯時中止
    if(i<right) {
        quickSort(strDate,i,right);
        
    }
    if(j>left) {
    quickSort(strDate,left,j);    
    }
}
    
public static void main(String[] args) {
    String [] strVoid= {"12","52","36","89","47","12","4","23","68"};
    
    SortTest  sort= new SortTest();
    sort.quickSort(strVoid, 0, strVoid.length-1);
    for(int i=0;i<strVoid.length;i++) {
        System.out.print(strVoid[i]+" ");
    }
}
}
View Code
相關文章
相關標籤/搜索