JAVA面試程序題

一、

1、請用Java寫一個冒泡排序方法

【參考答案】

public static void Bubble(int a[]){

for(int i=0;i

for(int j=a.length-1;j>i;j--){

if(a[j]

a[j]=a[j]+a[j-1];

a[j-1]=a[j]-a[j-1];

a[j]=a[j]-a[j-1];

}

}

}

}

2、子線程循環10次,接著主線程循環100,接著又回到子線程循環10次,接著再回到主線程又循環100,如此循環50次,請寫出程序。

【參考答案】

最終的程序代碼如下:

public class ThreadTest {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

new ThreadTest().init();

}

public void init()

{

final Business business = new Business();

new Thread(

new Runnable()

{

public void run() {

for(int i=0;i<50;i++)

{

business.SubThread(i);

}

}

}

).start();

for(int i=0;i<50;i++)

{

business.MainThread(i);

}

}

private class Business

{

boolean bShouldSub = true;//這里相當于定義了控制該誰執行的一個信號燈

public synchronized void MainThread(int i)

{

if(bShouldSub)

try {

this.wait();

}catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

for(int j=0;j<5;j++)

{

System.out.println(Thread.currentThread().getName() + ":i=" + i +",j=" + j);

}

bShouldSub= true;

this.notify();

}

public synchronized void SubThread(int i)

{

if(!bShouldSub)

try {

this.wait();

}catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

for(int j=0;j<10;j++)

{

System.out.println(Thread.currentThread().getName() + ":i=" + i +",j=" + j);

}

bShouldSub = false;

this.notify();

}

}

}

備注:不可能一上來就寫出上面的完整代碼,最初寫出來的代碼如下,問題在于兩個線程的代碼要參照同一個變量,即這兩個線程的代碼要共享數據,所以,把這兩個線程的執行代碼搬到同一個類中去:

package com.huawei.interview.lym;

public class ThreadTest {

private static booleanbShouldMain= false;

public static void main(String[] args) {

// TODO Auto-generated method stub

/*new Thread(){

public void run()

{

for(int i=0;i<50;i++)

{

for(int j=0;j<10;j++)

{

System.out.println("i=" + i + ",j=" + j);

}

}

}

}.start();*/

//final String str = new String("");

new Thread(

new Runnable()

{

public void run()

{

for(int i=0;i<50;i++)

{

synchronized (ThreadTest.class) {

if(bShouldMain)

{

try {

ThreadTest.class.wait();}

catch (InterruptedException e) {

e.printStackTrace();

}

}

for(int j=0;j<10;j++)

{

System.out.println(

Thread.currentThread().getName() +

"i=" + i + ",j=" + j);

}

bShouldMain= true;

ThreadTest.class.notify();

}

}

}

}

).start();

for(int i=0;i<50;i++)

{

synchronized (ThreadTest.class) {

if(!bShouldMain)

{

try {

ThreadTest.class.wait();}

catch (InterruptedException e) {

e.printStackTrace();

}

}

for(int j=0;j<5;j++)

{

System.out.println(

Thread.currentThread().getName() +

"i=" + i + ",j=" + j);

}

bShouldMain= false;

ThreadTest.class.notify();

}

}

}

}

下面使用jdk5中的并發庫來實現的:

import java.util.concurrent.Executors;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

import java.util.concurrent.locks.Condition;

public class ThreadTest

{

private static Lock lock = new ReentrantLock();

private static Condition subThreadCondition = lock.newCondition();

private static boolean bBhouldSubThread = false;

public static void main(String [] args)

{

ExecutorService threadPool = Executors.newFixedThreadPool(3);

threadPool.execute(new Runnable(){

public void run()

{

for(int i=0;i<50;i++)

{

lock.lock();

try

{

if(!bBhouldSubThread)

subThreadCondition.await();

for(int j=0;j<10;j++)

{

System.out.println(Thread.currentThread().getName() + ",j=" + j);

}

bBhouldSubThread = false;

subThreadCondition.signal();

}catch(Exception e)

{

}

finally

{

lock.unlock();

}

}

}

});

threadPool.shutdown();

for(int i=0;i<50;i++)

{

lock.lock();

try

{

if(bBhouldSubThread)

subThreadCondition.await();

for(int j=0;j<10;j++)

{

System.out.println(Thread.currentThread().getName() + ",j=" + j);

}

bBhouldSubThread = true;

subThreadCondition.signal();

}catch(Exception e)

{

}

finally

{

lock.unlock();

}

}

}

3、寫一個程序,把一個文件的數組按對角線做對稱變換,并輸出!

【參考答案】

一個正方形里面全數字,寫一個程序,成對角線轉變!我做的這個是3行3列的對角互換,也許轉換規則不一樣

public class testMain {

public static void main(String[] args) {

int a[][]=new int[3][3];

int c=1;

//初始化數據

for(int i=0;i<3;i++){

for(int j=0;j<3;j++){

a[i][j]=c++;

}

}

System.out.println("轉換之前:");

for(int i=0;i<3;i++){

for(int j=0;j<3;j++){

System.out.print("a["+i+"]["+j+"]="+a[i][j]+" ??");

}

System.out.println("\n");

}

for(int i=0;i<3;i++){

for(int j=0;j<3;j++){

if((i+1<3&&j+1<3)&&i==j&&i!=0&&i!=3-i){

int temp=a[i-1][j-1];

a[i-1][j-1]=a[i+1][j+1];

a[i+1][j+1]=temp;

temp=a[i-1][j+1];

a[i-1][j+1]=a[i+1][j-1];

a[i+1][j-1]=temp;

}

}

}

System.out.println("轉換之后:");

for(int i=0;i<3;i++){

for(int j=0;j<3;j++){

System.out

print("a["+i+"]["+j+"]="+a[i][j]+" ??");

}

System.out.println("\n");

}

}

}

4、寫一個方法,傳入一個int型的數字,把它的四個字節碼取出來,并且把它按大小順序通過控制臺輸出?

【參考答案】

public?static?void?main(String[]?args)?{

int?num?=?-800000000;

String?str?=?Integer.toBinaryString(num);?//獲得num的二進制

if(num>=0)?{????//如果輸入的數為正數,位數可能不足32位,要補0;負數肯定是32位

if(str.length()<32)?{?//二進制不足32位,就在前面補0

int?n0?=?32-str.length();?//看差幾個0

String?temp?=?"";

for(int?i=0;i

temp?=?temp?+?"0";?//拼0

}

str?=?temp?+?str;

}

}

String?s1?=?str.substring(0,?8);

String?s2?=?str.substring(8,?16);

String?s3?=?str.substring(16,?24);

String?s4?=?str.substring(24,?32);

System.out.println(str);

System.out.println(s1);

System.out.println(s2);

System.out.println(s3);

System.out.println(s4);

int?n1=Integer.parseInt(s1,2);//以二進制把字符串解析為10進制的數

int?n2=Integer.parseInt(s2,2);

int?n3=Integer.parseInt(s3,2);

int?n4=Integer.parseInt(s4,2);

System.out.println(n1);

System.out.println(n2);

System.out.println(n3);

System.out.println(n4);????????//整數大小自己比較吧

}

【分析】

5、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。

【參考答案】

以下程序使用內部類實現線程,對j增減的時候沒有考慮順序問題。

public class ThreadTest1

{

private int j;

public static void main(String args[]){

ThreadTest1 tt=new ThreadTest1();

Inc inc=tt.new Inc();

Dec dec=tt.new Dec();

for(int i=0;i<2;i++){

Thread t=new Thread(inc);

t.start();

t=new Thread(dec);

t.start();

}

}

private synchronized void inc(){

j++;

System.out.println(Thread.currentThread().getName()+"-inc:"+j);

}

private synchronized void dec(){

j--;

System.out.println(Thread.currentThread().getName()+"-dec:"+j);

}

class Inc implements Runnable{

public void run(){

for(int i=0;i<100;i++){

inc();

}

}

}

class Dec implements Runnable{

public void run(){

for(int i=0;i<100;i++){

dec();

}

}

}

}

----------隨手再寫的一個-------------

class A

{

JManger j =new JManager();

main()

{

new A().call();

}

void call

{

for(int i=0;i<2;i++)

{

new Thread(

new Runnable(){ public void run(){while(true){j.accumulate()}}}

).start();

new Thread(new Runnable(){ public void run(){while(true){j.sub()}}}).start();

}

}

}

class JManager

{

private j = 0;

public synchronized void subtract()

{

j--

}

public synchronized void accumulate()

{

j++;

}

}

6、十六進制的216轉換十進制是多少?

216是16進制,轉10進制:

=2*16^2+1*16^1+6*16^0

=512+16+6

=536

以下函數htoi函數的功能是將一個十六進制數字的字符串,轉換成它等價的十進制整數值。

Public int htoi(char s[])

{

Int i , n ;

N=0;

For(i=0 , s[i]<’\0’;i++)

{

If(s[i]>=0&&s[i]<=9) n=_______

If(s[i]>=’a’&&s[i]<=’f’) n=_________

If(s[i]>=’A’&&s[i]<=’F’) n=_________

}

Return (n);

}

7、如何把一段逗號分割的字符串轉換成一個數組?

【參考答案】

可以說說我的思路:

1.用正則表達式,代碼大概為:String [] result = orgStr.split(“,”);

2.用StingTokenizer ,代碼為:

StringTokenizer ?tokener = StringTokenizer(orgStr,”,”);

String [] result = new String[tokener .countTokens()];

Int i=0;

while(tokener.hasNext(){result[i++]=toker.nextToken();}

8、編寫一個函數將一個十六進制數的字符串參數轉換成整數返回。

【參考答案】

String str =“13abf”;

int len = str.length;

int sum = 0;

for(int i=0;i

char c = str.charAt(len-1-i);

int n = Character.digit(c,16);

sum += n * (1<<(4*i));

}

其實,也可以用Integer.parseInt(str,16),但面試官很可能是想考我們的編碼基本功。

9、讀取一個文件在控制臺打印出來

【參考答案】

File file =newFile("E:\\JRadioButtonDemo.java");

longfile_length= file.length();

try{

//輸入流

FileInputStream input =newFileInputStream(file);

byteb_data [] =newbyte[(int)file_length];

input.read(b_data);

System.out.println(newString(b_data));

input.close();

}catch(FileNotFoundException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

10、遞歸實現1,1,2,3,5,8,.30個數是多少?【上海菲耐德】

【參考答案】

public?static?int?Foo(int?i)

{

if?(i?<=?0)

return?0;

else?if(i?>?0?&&?i?<=?2)

return?1;

else?return?Foo(i?-1)?+?Foo(i?-?2);

}

int?i=Foo(30);

System.out.println(i);

11、求一個字符串中第一個無重復的字符

publicstaticvoidgetUniqueString(String str){

booleanbool =true;

for(inti=0;i

String s1 = str.substring(i, i+1);

if(str.indexOf(s1, i+1)==-1){

System.out.println(s1);

bool =false;

}

}

}

12、寫一個遞歸函數,輸入一個整數,反序輸出這個整數

//寫一個遞歸函數,輸入一個整數,反序輸出這個整數

publicstaticvoidprintOut(intn) {

System.out.print(n % 10);

if(n >= 10){

printOut(n / 10);

}

}

13、有一個數據文件:123 34 ?17 ?651234 ?345....這些數據都是隨機產生的,編寫程序讀出該文件.并將其以從大到小的順序輸出到另一個文件中.

public void readtext(){

File file = new File("D:\test.txt");

List list= new ArrayList();

try {

BufferedReader br=new BufferedReader(new FileReader(file));

String data = "";

String line = null;

while ( (line = br.readLine()) != null) {

data = data.concat(line);

}

StringTokenizer stoken = new StringTokenizer(data, " ");

while (stoken.hasMoreTokens()) {

int i = Integer.parseInt(stoken.nextToken());

list.add(i);

}

}catch(Exception ex) {}

String[] str = new String[list.size()];

for(int i=0;i

str[i]=list.get(i);

}

Object iTemp= null;

for(int i=1;i

for(int j=list.size()-1;j>=i;j--) {

if(str[j]>str[j-1]) {

iTemp = str[j-1];

str[j-1] = str[j];

str[j] = iTemp;

}

}

String result = "";

for(int i=0;i

result +=str[i]+" ";

}

//將result寫入另外一個文件即可。

}

14、從一到十九共十九個數,打印出利用這十九個整數任意多個相加等于20所以可能性,每個數字在同一個算式中只出現一次.

public void test(){

Integer[] a = new Integer[19];

for(int i=1;i<20;i++){

a[i-1]=i;

}

for(int i=0;i<18;i++){

for(int j=18-i;j<18;j++)

if(a[i]+a[j]==20)

System.out.println(a[i]+"+"+a[i+1]+"="+20);

}

}

15、一個字符串中可能存在A-Z的全角字符,寫一個方法把里面的全角字符轉變成半角字符?

答:采用建立字典表進行查找轉換

public??static?String?translate(String?s){

String?qj?=?"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

String?bj?=?"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

StringBuffer?sb?=?new?StringBuffer();

for(int?i=0;i

char?c?=?s.charAt(i);

int?pos?=?qj.indexOf(c);

if(pos>=0){

System.out.println(c?+?","?+?pos);

sb.append(bj.charAt(pos));

}else{

sb.append(c);

}

}

return?sb.toString();

}

16、Stack堆棧,實現進棧、出棧。【云巢動脈面試題】

package t1;

public class mystack {

private Object[] data;

private int top=-1;

private int size;

public mystack()

{

data=new Object[5];

size=5;

}

public mystack(int size)

{

data=new Object[size];

this.size=size;

}

public void push(Object obj)

{

if(this.isfull())

{

return ;

}

top++;

data[top]=obj;

}

public Object pop() {

if(this.isempty())

{

return null;

}

Object obj=data[top];

top--;

return obj ;

}

public boolean isfull()

{

if(top==data.length)

{

return true;

}

else

{

return false;

}

}

public boolean isempty()

{

if(top==-1)

{

return true;

}

else

{

return false;

}

}

}

17、定義兩個變量ab,不使用第三個變量,使兩個值交換

public class testMain {

public void test(int a,int b){

System.out.println("交換前a = "+a);

System.out.println("交換前b = "+b);

a=a+b;

b=a-b;

a=a-b;

System.out.println("交換后a = " +a);

System.out.print("交換后b = "+b);

}

public static void main(String args[]){

new testMain().test(10,13);

}

}

18、針對一個分期付款,總期為1年,給定分期金額,期數和開始還款時間,計算出各期還款日期。

package?demo;

import?java.util.Calendar;

import?java.util.Date;

public?class?TestDemo?{

//分期付款,總期為1年,給定分期金額,期數和開始還款時間

//計算出各期還款日期

public?void?huankuan(double?amount,int??num,Date?start){

int?period?=?365/num;?//一年中分期間隔天數

Calendar?cal?=?Calendar.getInstance();

cal.set(Calendar.YEAR,?start.getYear()+1900);

cal.set(Calendar.MONTH,?start.getMonth());

cal.set(Calendar.DATE,?start.getDate());

for(int?i=1;i<=num;i++){

System.out.println("第"?+?i?+?"期還款日期:?"?+?cal.getTime().toLocaleString());

cal.add(Calendar.DATE,?period);

}

}

public?static?void?main(String[]?args)?{

TestDemo?demo?=?new?TestDemo();

demo.huankuan(20000.00,?1,?new?Date());

}

}

19、用一個方法查出宜個數值類型數組的最大值,用遞歸方式實現。【高達軟件】

方法1

public class Test1 {

public static int a(int[] i,int j){

if(i.length-1>j){

if(i[j]>i[j+1]){

i[j+1]=i[j];

}

return a(i,j+1);

}else{

return i[i.length-1];

}

}

}

方法2 ?--非遞歸

public ?static int ?test(int ?[]num){

int x=0;

int log ??= ?num.Length;

for(intt=0;t

if(num[t]>x){

x=num[t];

}

}return ?x;

}

方法3 ---遞歸不改變原數組中的元素

public static int getMax(int[]a, int index,int max){

int len = a.length;

if(len==1){

return a[len-1];

}

if(index==0){

max = a[index];

}

if(index==len){

return max;

}

if(max

max = a[index];

}

index++;

return getMax(a,index,max);

}

//測試

int max = getMax(new int[]{2,5,18,3,38,10,2},0,0);

System.out.println(max);

20、C編寫將一個100以內的自然數分解質因數

/* ?100以內素數*/

#include

main()

{

int i,j;

for(i=2;i<100;i++)

{

for(j=2;j

{

if(i%j==0)

break;

}

if(i==j)

{

printf("%d ",i);

}

}

}

/*分解質因數*/

main()

{

int ??n,i;

printf( "please ??input ??a ??number:\n ");

scanf( "%d ",&n);

printf( "%d= ",n);

for(i=2;i <=n;i++)

while(n!=i)

{

if(n%i==0)

{

printf( "%d* ",i);

n=n/i;

} else{break;}

}

printf( "%d ",n);

getch();

}

21、main方法中將字符串中的數字排序并輸出STRING A="56.89.5.3.75.98.98.26.15.44"

String s=”56.89.5.3.75.98.98.26.15.44”;

String s1[]=s. split (“.”);

Integer ii[]=new Integer[s1.length];

For(int i=0;i

ii[i]=Integer.parseInt(s1[i]);

}

Arrays.sort(ii);

for(Integer o: ii){

System.out.println(o+”s”);

}

22、40,用你所知道的數學方法計算出24

0的階乘等于1即0!=1那么4個0就是4了

又4的階乘為244!=24

23、判斷身份證:要么是15位,要么是18位,最后一位可以為字母,并寫程序提出其中的年月日。

答:我們可以用正則表達式來定義復雜的字符串格式,(\d{17}[0-9a-zA-Z]|\d{14}[0-9a-zA-Z])可以用來判斷是否為合法的15位或18位身份證號碼。

因為15位和18位的身份證號碼都是從7位到第12位為身份證為日期類型。這樣我們可以設計出更精確的正則模式,使身份證號的日期合法,這樣我們的正則模式可以進一步將日期部分的正則修改為[12][0-9]{3}[01][0-9][123][0-9],當然可以更精確的設置日期。

在jdk的java.util.Regex包中有實現正則的類,Pattern和Matcher。以下是實現代碼:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexTest {

/**

* @param args

*/

public static void main(String[] args) {

//測試是否為合法的身份證號碼

String[] strs = { "130681198712092019", "13068119871209201x",

"13068119871209201", "123456789012345", "12345678901234x",

"1234567890123" };

Pattern p1 = Pattern.compile("(\\d{17}[0-9a-zA-Z]|\\d{14}[0-9a-zA-Z])");

for (int i = 0; i < strs.length; i++) {

Matcher matcher = p1.matcher(strs[i]);

System.out.println(strs[i] + ":" + matcher.matches());

}

Pattern p2 = Pattern.compile("\\d{6}(\\d{8}).*"); //用于提取出生日字符串

Pattern p3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");//用于將生日字符串進行分解為年月日

for (int i = 0; i < strs.length; i++) {

Matcher matcher = p2.matcher(strs[i]);

boolean b = matcher.find();

if (b) {

String s = matcher.group(1);

Matcher matcher2 = p3.matcher(s);

if (matcher2.find()) {

System.out

.println("生日為" + matcher2.group(1) + "年"

+ matcher2.group(2) + "月"

+ matcher2.group(3) + "日");

}

}

}

}

}

24、編寫一個程序,將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中,a.txt文件中的單詞用回車符分隔,b.txt文件中用回車或空格進行分隔。

答:

package cn.itcast;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

public class MainClass{

public static void main(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;

public FileManager(String filename,char[] seperators) throws Exception{

File f = new File(filename);

FileReader reader = new FileReader(f);

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

int len = reader.read(buf);

String results = 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 String nextWord(){

if(pos == words.length)

return null;

return words[pos++];

}

}

25、編寫一個程序,將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 void main(String[] args) throws Exception {

File srcDir = new File("java");

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

throw new Exception("目錄不存在");

File[] files = srcDir.listFiles(

new FilenameFilter(){

public boolean accept(File dir, String name) {

return name.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);

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

FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));

copy(fis,fos);

fis.close();

fos.close();

}

}

private static void copy(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 jad2java{

1.得到某個目錄下的所有的java文件集合

1.1得到目錄File srcDir = new File("d:\\java");

1.2得到目錄下的所有java文件:File[] files = srcDir.listFiles(new MyFileFilter());

1.3只想得到.java的文件:class MyFileFilter implememyts FileFilter{

public boolean accept(File pathname){

return pathname.getName().endsWith(".java")

}

}

2.將每個文件復制到另外一個目錄,并改擴展名

2.1得到目標目錄,如果目標目錄不存在,則創建之

2.2根據源文件名得到目標文件名,注意要用正則表達式,注意.的轉義。

2.3根據表示目錄的File和目標文件名的字符串,得到表示目標文件的File。

//要在硬盤中準確地創建出一個文件,需要知道文件名和文件的目錄。

2.4將源文件的流拷貝成目標文件流,拷貝方法獨立成為一個方法,方法的參數采用抽象流的形式。

//方法接受的參數類型盡量面向父類,越抽象越好,這樣適應面更寬廣。

}

分析listFiles方法內部的策略模式實現原理

File[] listFiles(FileFilter filter){

File[] files = listFiles();

//Arraylist acceptedFilesList = new ArrayList();

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

int pos = 0;

for(File file: files){

boolean accepted = filter.accept(file);

if(accepted){

//acceptedFilesList.add(file);

acceptedFiles[pos++] = file;

}

}

Arrays.copyOf(acceptedFiles,pos);

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

}

26、編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串,但要保證漢字不被截取半個,如“我ABC”,4,應該截取“我AB”,輸入“我ABCDEF”,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;

boolean bChineseFirstHalf = false;

for(int i=0;i

{

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

bChineseFirstHalf = true;

}else{

num++;

bChineseFirstHalf = false;

}

}

return num;

}

27、有一個字符串,其中包含中文字符、英文字符和數字字符,請統計和打印出各個字符的個數。

答:String content =“中國aadf的111薩bbb菲的zz薩菲”;

HashMap map = new HashMap();

for(int i=0;i

{

char c = content.charAt(i);

Integer num = map.get(c);

if(num == null)

num = 1;

else

num = num + 1;

map.put(c,num);

}

for(Map.EntrySet entry : map)

{

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

}

如果一串字符如"aaaabbc中國1512"要分別統計英文字符的數量,中文字符的數量,和數字字符的數量,假設字符中沒有中文字符、英文字符、數字字符之外的其他特殊字符。

int engishCount;

int chineseCount;

int digitCount;

for(int i=0;i

{

char ch = str.charAt(i);

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

{

digitCount++

}

else if((ch>=’a’&& ch<=’z’) || (ch>=’A’&& ch<=’Z’))

{

engishCount++;

}

else

{

chineseCount++;

}

}

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

28、從類似如下的文本文件中讀取出所有的姓名,并打印出重復的姓名和重復的次數,并按重復次數排序:

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;

public class GetNameTest {

/**

* @param args

*/

public static void main(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 = new BufferedReader(new InputStreamReader(ips));

String line = null;

try {

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

{

dealLine(line,results);

}

sortResults(results);

}catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

static class User

{

public ?String name;

public Integer value;

public User(String name,Integer value)

{

this.name = name;

this.value = value;

}

@Override

public boolean equals(Object obj) {

// TODO Auto-generated method stub

//下面的代碼沒有執行,說明往treeset中增加數據時,不會使用到equals方法。

boolean result = super.equals(obj);

System.out.println(result);

return result;

}

}

private static void sortResults(Map results) {

// TODO Auto-generated method stub

TreeSet sortedResults = new TreeSet(

new Comparator(){

public int compare(Object o1, Object o2) {

// TODO Auto-generated method stub

User user1 = (User)o1;

User user2 = (User)o2;

/*如果compareTo返回結果0,則認為兩個對象相等,新的對象不會增加到集合中去

*所以,不能直接用下面的代碼,否則,那些個數相同的其他姓名就打印不出來。

* */

//return user1.value-user2.value;

//return user1.value

if(user1.value

{

return -1;

}else if(user1.value>user2.value)

{

return 1;

}else

{

return user1.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(new User(name,value));

}

}

printResults(sortedResults);

}

private static void printResults(TreeSet sortedResults)

{

Iterator iterator ?= sortedResults.iterator();

while(iterator.hasNext())

{

User user = (User)iterator.next();

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

}

}

public static void dealLine(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);

}

}

}

}

29、寫一個Singleton出來。

第一種:飽漢模式

public class SingleTon {

private SingleTon(){

}

//實例化放在靜態代碼塊里可提高程序的執行效率,但也可能更占用空間

private final static SingleTon instance = new SingleTon();

public static SingleTon getInstance(){

return instance;

}

}

第二種:饑漢模式

public class SingleTon {

private SingleTon(){}

private static instance = null;//new SingleTon();

public static synchronized SingleTon getInstance(){

if(instance == null)

instance = new SingleTon();

return instance;

}

}

第三種:用枚舉

public enum SingleTon{

ONE;

}

第三:更實際的應用(在什么情況用單例)

public class SequenceGenerator{

//下面是該類自身的業務功能代碼

private int count = 0;

public synchronized int getSequence(){

++count;

}

//下面是把該類變成單例的代碼

private SequenceGenerator(){}

private final static instance = new SequenceGenerator();

public static SingleTon getInstance(){

return instance;

}

}

第四:

public class MemoryDao

{

private HashMap map = new HashMap();

public void add(Student stu1){

map.put(SequenceGenerator.getInstance().getSequence(),stu1);

}

//把MemoryDao變成單例

}

Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

一般Singleton模式通常有幾種種形式:

第一種形式:定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。

public class Singleton {

private Singleton(){}

//在自己內部定義自己一個實例,是不是很奇怪?

//注意這是private只供內部調用

private static Singleton instance = new Singleton();

//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問

public static Singleton getInstance() {

return instance;

}

}

第二種形式:

public class Singleton {

private static Singleton instance = null;

public static synchronized Singleton getInstance() {

//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次

//使用時生成實例,提高了效率!

if (instance==null)

instance=new Singleton();

return instance;

}

}

其他形式:

定義一個類,它的構造函數為private的,所有方法為static的。

一般認為第一種形式要更加安全些

30、一個整數,大于0,不用循環和本地變量,按照n2n4n8n的順序遞增,當值大于5000時,把值按照指定順序輸出來。

例:n=1237

則輸出為:

1237,

2474,

4948,

9896,

9896,

4948,

2474,

1237,

提示:寫程序時,先致謝按遞增方式的代碼,寫好遞增的以后,再增加考慮遞減部分。

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

31、1個人10,第2個比第1個人大2歲,依次遞推,請用遞歸方式計算出第8個人多大?

package cn.demo;

import java.util.Date;

public class A1 {

public static void main(String [] args)

{

System.out.println(computeAge(8));

}

public static int computeAge(int n)

{

if(n==1) return 10;

returncomputeAge(n-1) + 2;

}

}

public static void toBinary(int n,StringBuffer result)

{

if(n/2 != 0)

toBinary(n/2,result);

result.append(n%2);

}

32、排序都有哪幾種方法?請列舉。用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&& i

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

quickSort(strDate,i,right);//從

}

if(j>left){

quickSort(strDate,left,j);

}

}

/**

* @param args

*/

public static void main(String[] args){

String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};

QuickSort sort=new QuickSort();

sort.quickSort(strVoid,0,strVoid.length-1);

for(int i=0;i

System.out.println(strVoid[i]+" ");

}

}

}

33、有數組a[n],用java代碼將數組元素順序顛倒

//用下面的也可以

//for(int i=0,int j=a.length-1;i

import java.util.Arrays;

public class SwapDemo{

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

int tmp = a[i];

a[i] = a[len-1-i];

a[len-1-i] = tmp;

}

}

}

34、寫一個方法,用一個for循環打印九九乘法表

/**?*//**

*打印九九乘法口訣表

*/

public?void?nineNineMulitTable(){

for?(int?i?=?1,j?=?1;?j?<=?9;?i++)?{

System.out.print(i+"*"+j+"="+i*j+"?");

if(i==j){

i=0;

j++;

System.out.println();

}

}

}

35、給定一個java.util.Date對象,如何轉化為”2007-3-22?20:23:22”格式的字符串。【高達軟件】

/**?*//**

*將某個日期以固定格式轉化成字符串

*?@param?date

*?@return?str

*/

public?String?date2FormatStr(Date?date)

{

SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss");

String?str?=?sdf.format(date);

return?str;

}

36、金額轉換,阿拉伯數字的金額轉換成中國傳統的形式如:(¥1011)->(一千零一拾一元整)輸出。

去零的代碼:

return sb.reverse().toString().replaceAll("零[拾佰仟]","零").replaceAll("零+萬","萬").replaceAll("零+元","元").replaceAll("零+","零");

public class RenMingBi {

/**

* @param args add by zxx ,Nov 29, 2008

*/

private static final char[] data = new char[]{

'零','壹','貳','叁','肆','伍','陸','柒','捌','玖'

};

private static final char[] units = new char[]{

'元','拾','佰','仟','萬','拾','佰','仟','億'

};

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println(

convert(135689123));

}

public static String convert(int money)

{

StringBuffer sbf = new StringBuffer();

int unit = 0;

while(money!=0)

{

sbf.insert(0,units[unit++]);

int number = money%10;

sbf.insert(0, data[number]);

money /= 10;

}

return sbf.toString();

}

}

37、寫一個方法,能夠判斷任意一個整數是否素數

/** *//**

*判斷任意一個整數是否素數

* @param num

* @return boolean

*/

public boolean isPrimeNumber(int num)

{

for (int i = 2; i <= Math.sqrt(num); i++) {

if(num%i==0)

{

return false;

}

}

return true;

}

38、123455個數字,用Java寫一個Main函數,打印所有不同的排序

static int[] bits = new int[] { 1, 2, 3, 4, 5 };

/**

* @param args

*/

public static void main(String[] args) {

sort("", bits);

}

private static void sort(String prefix, int[] a) {

if (a.length == 1) {

System.out.println(prefix + a[0]);

}

for (int i = 0; i < a.length; i++) {

sort(prefix + a[i], copy(a, i));

}

}

private static int[] copy(int[] a,int index){

int[] b = new int[a.length-1];

System.arraycopy(a, 0, b, 0, index);

System.arraycopy(a, index+1, b, index, a.length-index-1);

return b;

}

39、寫一個方法,輸入任意一個整數,返回它的階乘

/**?*//**

*獲得任意一個整數的階乘

n

!

*/

public?int?factorial(int?num)

{

//遞歸

if(num?==?1)

{

return?1;

}

return?num*factorial(num-1);

}

40、寫一個方法,用二分查找法判斷任意整數在任意整數數組里面是否存在,若存在就返回它在數組中的索引位置,不存在返回-1

/**?*//**

*二分查找特定整數在整型數組中的位置(遞歸)

dataset

data

beginIndex

endIndex

index

*/

public?int?binarySearch(int[]?dataset,int?data,int?beginIndex,int?endIndex){

int?midIndex?=?(beginIndex+endIndex)/2;

//如果查找的數要比開始索引的數據要小或者是比結束索引的書要大,或者開始查找的索引值大于結束的索引值返回-1沒有查到

if(data?dataset[endIndex]||beginIndex>endIndex){

return?-1;

}

if(data?

return?binarySearch(dataset,data,beginIndex,midIndex-1);

}else?if(data>dataset[midIndex])

{

return?binarySearch(dataset,data,midIndex+1,endIndex);

}else?{

return?midIndex;

}

}

/**?*//**

*二分查找特定整數在整型數組中的位置(非遞歸)

dataset

data

index

*/

public?int?binarySearch(int[]?dataset?,int?data)

{

int?beginIndex?=?0;

int?endIndex?=?dataset.length?-?1;

int?midIndex?=?-1;

if(data?dataset[endIndex]||beginIndex>endIndex){

return?-1;

}

while(beginIndex?<=?endIndex)?{

midIndex?=?(beginIndex+endIndex)/2;

if(data?

endIndex?=?midIndex-1;

}?else?if(data>dataset[midIndex])?{

beginIndex?=?midIndex+1;

}else?{

return?midIndex;

}

}

return?-1;

}

41、如果一個序列的前四個數字分別是2,9,28,65請問第五個數字是?

13+1=2

23+1=9

32+1=28

43+1=65

所以繼續的話應是

53+1=126

42、編寫函數找出11000之內能被3整除且不是偶數的整數,并按個位數的大小從大到小排序

public List find() {

List list=new ArrayList();

for (int i = 1; i <=1000; i++) {

if (i%3==0 && i%2!=0) {

list.add(i);

}

}

return list;

}

43、java方法編寫計算指定目錄下所有文件占空間大小

//返回文件大小private void getFileSize()throws RuntimeException,IOException

{//初始化文件大小為0;

this.longSize=0;

//如果文件存在而且是文件,直接返回文件大小

if(file.exists()&&file.isFile()){

this.longSize= file.length();

}

//文件存在而且是目錄,遞歸遍歷文件目錄計算文件大小else if(file.exists()&&file.isDirectory()){

getFileSize(file);//遞歸遍歷

}else{

throw new RuntimeException("指定文件不存在");

}

}

44、一個list中,有b.a.b.c.b.b.寫個方法去掉所有b

public List qub(List list) {

List alist=new ArrayList();

for (int i = 0; i < list.size(); i++) {

String a=(String)list.get(i);

if (!a.equals("b")) {

alist.add(a);

}

}

return alist;

}

45、設計線程的生產者和消費者模式

package com;

import java.io.*;

import java.util.*;

public class Test1 {

Vector v = new Vector();

int index = -1;

boolean isput = false;

public synchronized void put(String name) throws InterruptedException{

if(isput){

wait();

}

v.add(name);

index++;

isput = true;

notify();

System.out.println(Thread.currentThread().getName());

}

public synchronized ?void get() throws InterruptedException{

if(!isput){

wait();

}

System.out.println(Thread.currentThread().getName()+"取:"+v.get(index));

isput = false;

notify();

}

public static void main(String[] args) throws CloneNotSupportedException, FileNotFoundException, IOException, InterruptedException {

Test1 t = new Test1();

A a = new A(t);

B b = new B(t);

new Thread(a).start();

new Thread(b).start();

}

}

class A implements Runnable{

Test1 t;

public A(Test1 t){

this.t = t;

}

@Override

public void run() {

int i ?=0 ;

while(true){

if(i==0){

try {

t.put("男");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}else{

try {

t.put("女");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

i = (i+1)%2;

}

}

}

class B implements Runnable{

Test1 t;

public B(Test1 t){

this.t = t;

}

@Override

public void run() {

// TODO Auto-generated method stub

while(true){

try {

t.get();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

46、寫一個方法求兩個數的公約數

importjava.util.ArrayList;

importjava.util.List;

publicclassMaxNum {

intnum=0;

publicListMaxs(inta){//先找出能被第一個數整除的數

List list=newArrayList();

for(inti = 1; i <= a; i++) {

if(a%i==0){

list.add(i);

}

}

returnlist;

}

publicvoidTest(inta,intb){

List list=newMaxNum().Maxs(a);

for(inti = 0; i < list.size(); i++) {

intbb=(Integer) list.get(i);

if(b%bb==0){//找出能被第二個數整出并且也能被第二個數整除的數

num=bb;

}

}

System.out.println("最大公約數為:"+num);

}

publicstaticvoidmain(String[] args) {

newMaxNum().Test(100,1000);

}

}

47、實現字符串的反轉。如:abcd輸出dcba

答:

StringBufferstringBuffer =

newStringBuffer().append("abc").reverse();

System.out.println(stringBuffer.toString());

48、編寫程序將由數字及字符組成的字符串中的數字截取出來并按順序輸出,例如:ABC137GMNQQ2049PN5FFF”輸出結果應該為01234579

package com.tarena;

import java.util.Arrays;

public class NumberSplitChar {

public static void main(String[] args) {

String str=”ABC137GMNQQ2049PN5FFF”;

char[] beforechars=str.toCharArray();

char[] afterchars=new char[beforechars.length];

int j=0;

for(int i=0;i

if(beforechars[i]>=’0' && beforechars[i]<=’9'){

afterchars[j++]=beforechars[i];

}

}

Arrays.sort(afterchars);

for(int i=(afterchars.length-j);i

System.out.print(afterchars[i]);

}

}

}

下載完整面試題文件:

https://www.duyunwl.cn/2019/03/08/java面試題大全/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容

  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔...
    葉總韓閱讀 5,144評論 0 41
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,704評論 18 399
  • Java經典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,885評論 0 2
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用。 當JAVA程序違反了JA...
    八爺君閱讀 4,623評論 1 114
  • 五月觀花欲訴蓮, 風吹雨噬綠盈氈。 楊桃艷絢呈嬌態, 杏柳叨歡顯媚憐。 鎖怨封情波意寄, 含眸閉蕩頌清乾。 江南泛...
    喜在心間閱讀 1,053評論 0 0