一、
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、定義兩個變量a和b,不使用第三個變量,使兩個值交換
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、用4個0,用你所知道的數學方法計算出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”,輸入“我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;
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,不用循環和本地變量,按照n,2n,4n,8n的順序遞增,當值大于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、用1、2、3、4、5這5個數字,用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、編寫函數找出1到1000之內能被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面試題大全/