一、
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梦染、子線程循環(huán)10次叠赦,接著主線程循環(huán)100涛漂,接著又回到子線程循環(huán)10次看蚜,接著再回到主線程又循環(huán)100,如此循環(huán)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;//這里相當(dāng)于定義了控制該誰執(zhí)行的一個信號燈
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();
}
}
}
備注:不可能一上來就寫出上面的完整代碼,最初寫出來的代碼如下妙啃,問題在于兩個線程的代碼要參照同一個變量档泽,即這兩個線程的代碼要共享數(shù)據(jù),所以揖赴,把這兩個線程的執(zhí)行代碼搬到同一個類中去:
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中的并發(fā)庫來實(shí)現(xiàn)的:
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馆匿、寫一個程序,把一個文件的數(shù)組按對角線做對稱變換,并輸出!
【參考答案】
一個正方形里面全數(shù)字,寫一個程序,成對角線轉(zhuǎn)變!我做的這個是3行3列的對角互換,也許轉(zhuǎn)換規(guī)則不一樣
public class testMain {
public static void main(String[] args) {
int a[][]=new int[3][3];
int c=1;
//初始化數(shù)據(jù)
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
a[i][j]=c++;
}
}
System.out.println("轉(zhuǎn)換之前:");
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("轉(zhuǎn)換之后:");
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型的數(shù)字,把它的四個字節(jié)碼取出來铭拧,并且把它按大小順序通過控制臺輸出腔稀?
【參考答案】
public?static?void?main(String[]?args)?{
int?num?=?-800000000;
String?str?=?Integer.toBinaryString(num);?//獲得num的二進(jìn)制
if(num>=0)?{????//如果輸入的數(shù)為正數(shù),位數(shù)可能不足32位,要補(bǔ)0羽历;負(fù)數(shù)肯定是32位
if(str.length()<32)?{?//二進(jìn)制不足32位焊虏,就在前面補(bǔ)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);//以二進(jìn)制把字符串解析為10進(jìn)制的數(shù)
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);????????//整數(shù)大小自己比較吧
}
【分析】
5、設(shè)計4個線程秕磷,其中兩個線程每次對j增加1诵闭,另外兩個線程對j每次減少1。寫出程序澎嚣。
【參考答案】
以下程序使用內(nèi)部類實(shí)現(xiàn)線程疏尿,對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易桃、十六進(jìn)制的216轉(zhuǎn)換十進(jìn)制是多少褥琐?
216是16進(jìn)制,轉(zhuǎn)10進(jìn)制:
=2*16^2+1*16^1+6*16^0
=512+16+6
=536
以下函數(shù)htoi函數(shù)的功能是將一個十六進(jìn)制數(shù)字的字符串晤郑,轉(zhuǎn)換成它等價的十進(jìn)制整數(shù)值敌呈。
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、如何把一段逗號分割的字符串轉(zhuǎn)換成一個數(shù)組?
【參考答案】
可以說說我的思路:
1.用正則表達(dá)式造寝,代碼大概為: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磕洪、編寫一個函數(shù)將一個十六進(jìn)制數(shù)的字符串參數(shù)轉(zhuǎn)換成整數(shù)返回。
【參考答案】
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));
}
其實(shí)诫龙,也可以用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谷异、遞歸實(shí)現(xiàn)1,1,2,3,5,8,….第30個數(shù)是多少分尸?【上海菲耐德】
【參考答案】
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、求一個字符串中第一個無重復(fù)的字符
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歹嘹、寫一個遞歸函數(shù)箩绍,輸入一個整數(shù),反序輸出這個整數(shù)
//寫一個遞歸函數(shù)荞下,輸入一個整數(shù)伶选,反序輸出這個整數(shù)
publicstaticvoidprintOut(intn) {
System.out.print(n % 10);
if(n >= 10){
printOut(n / 10);
}
}
13史飞、有一個數(shù)據(jù)文件:123 34 ?17 ?651234 ?345....這些數(shù)據(jù)都是隨機(jī)產(chǎn)生的,編寫程序讀出該文件.并將其以從大到小的順序輸出到另一個文件中.
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、從一到十九共十九個數(shù),打印出利用這十九個整數(shù)任意多個相加等于20所以可能性,每個數(shù)字在同一個算式中只出現(xiàn)一次.
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的全角字符抽诉,寫一個方法把里面的全角字符轉(zhuǎn)變成半角字符?
答:采用建立字典表進(jìn)行查找轉(zhuǎn)換
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堆棧迹淌,實(shí)現(xiàn)進(jìn)棧、出棧己单“η裕【云巢動脈面試題】
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年蔓涧,給定分期金額,期數(shù)和開始還款時間笋额,計算出各期還款日期元暴。
package?demo;
import?java.util.Calendar;
import?java.util.Date;
public?class?TestDemo?{
//分期付款,總期為1年兄猩,給定分期金額茉盏,期數(shù)和開始還款時間
//計算出各期還款日期
public?void?huankuan(double?amount,int??num,Date?start){
int?period?=?365/num;?//一年中分期間隔天數(shù)
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、用一個方法查出宜個數(shù)值類型數(shù)組的最大值枢冤,用遞歸方式實(shí)現(xiàn)援岩。【高達(dá)軟件】
方法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 ---遞歸不改變原數(shù)組中的元素
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以內(nèi)的自然數(shù)分解質(zhì)因數(shù)
/* ?100以內(nèi)素數(shù)*/
#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);
}
}
}
/*分解質(zhì)因數(shù)*/
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方法中將字符串中的數(shù)字排序并輸出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趟咆,用你所知道的數(shù)學(xué)方法計算出24
0的階乘等于1即0L泶伞=1那么4個0就是4了
又4的階乘為244C诽搿=24
23、判斷身份證:要么是15位鳞贷,要么是18位坯汤,最后一位可以為字母,并寫程序提出其中的年月日搀愧。
答:我們可以用正則表達(dá)式來定義復(fù)雜的字符串格式惰聂,(\d{17}[0-9a-zA-Z]|\d{14}[0-9a-zA-Z])可以用來判斷是否為合法的15位或18位身份證號碼。
因?yàn)?5位和18位的身份證號碼都是從7位到第12位為身份證為日期類型咱筛。這樣我們可以設(shè)計出更精確的正則模式搓幌,使身份證號的日期合法,這樣我們的正則模式可以進(jìn)一步將日期部分的正則修改為[12][0-9]{3}[01][0-9][123][0-9]迅箩,當(dāng)然可以更精確的設(shè)置日期溉愁。
在jdk的java.util.Regex包中有實(shí)現(xiàn)正則的類,Pattern和Matcher。以下是實(shí)現(xiàn)代碼:
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})");//用于將生日字符串進(jìn)行分解為年月日
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文件中用回車或空格進(jìn)行分隔堂污。
答:
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文件復(fù)制到d:\jad目錄下儡湾,并將原來文件的擴(kuò)展名從.java改為.jad溉瓶。
答:listFiles方法接受一個FileFilter對象杏节,這個FileFilter對象就是過慮的策略對象兵睛,不同的人提供不同的FileFilter實(shí)現(xiàn),即提供了不同的過濾策略圃泡。
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);
}
}
}
由本題總結(jié)的思想及策略模式的解析:
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.將每個文件復(fù)制到另外一個目錄碟案,并改擴(kuò)展名
2.1得到目標(biāo)目錄,如果目標(biāo)目錄不存在颇蜡,則創(chuàng)建之
2.2根據(jù)源文件名得到目標(biāo)文件名价说,注意要用正則表達(dá)式,注意.的轉(zhuǎn)義风秤。
2.3根據(jù)表示目錄的File和目標(biāo)文件名的字符串鳖目,得到表示目標(biāo)文件的File。
//要在硬盤中準(zhǔn)確地創(chuàng)建出一個文件缤弦,需要知道文件名和文件的目錄领迈。
2.4將源文件的流拷貝成目標(biāo)文件流,拷貝方法獨(dú)立成為一個方法,方法的參數(shù)采用抽象流的形式狸捅。
//方法接受的參數(shù)類型盡量面向父類衷蜓,越抽象越好,這樣適應(yīng)面更寬廣尘喝。
}
分析listFiles方法內(nèi)部的策略模式實(shí)現(xiàn)原理
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磁浇、編寫一個截取字符串的函數(shù),輸入為一個字符串和字節(jié)數(shù)朽褪,輸出為按字節(jié)截取的字符串置吓,但要保證漢字不被截取半個,如“我ABC”缔赠,4衍锚,應(yīng)該截取“我AB”,輸入“我ABC漢DEF”橡淑,6构拳,應(yīng)該輸出“我ABC”咆爽,而不是“我ABC+漢的半個”梁棠。
答:
首先要了解中文字符有多種編碼及各種編碼的特征。
假設(shè)n為要截取的字節(jié)數(shù)斗埂。
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符糊、有一個字符串,其中包含中文字符呛凶、英文字符和數(shù)字字符男娄,請統(tǒng)計和打印出各個字符的個數(shù)。
答: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"要分別統(tǒng)計英文字符的數(shù)量漾稀,中文字符的數(shù)量模闲,和數(shù)字字符的數(shù)量,假設(shè)字符中沒有中文字符崭捍、英文字符尸折、數(shù)字字符之外的其他特殊字符。
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殷蛇、從類似如下的文本文件中讀取出所有的姓名实夹,并打印出重復(fù)的姓名和重復(fù)的次數(shù),并按重復(fù)次數(shù)排序:
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");
//用上一行注釋的代碼和下一行的代碼都可以粒梦,因?yàn)閕nfo.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
//下面的代碼沒有執(zhí)行匀们,說明往treeset中增加數(shù)據(jù)時缴淋,不會使用到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返回結(jié)果0,則認(rèn)為兩個對象相等重抖,新的對象不會增加到集合中去
*所以圆存,不能直接用下面的代碼,否則仇哆,那些個數(shù)相同的其他姓名就打印不出來沦辙。
* */
//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(){
}
//實(shí)例化放在靜態(tài)代碼塊里可提高程序的執(zhí)行效率油讯,但也可能更占用空間
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;
}
第三:更實(shí)際的應(yīng)用(在什么情況用單例)
public class SequenceGenerator{
//下面是該類自身的業(yè)務(wù)功能代碼
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應(yīng)用程序中,一個類Class只有一個實(shí)例存在延欠。
一般Singleton模式通常有幾種種形式:
第一種形式:定義一個類陌兑,它的構(gòu)造函數(shù)為private的,它有一個static的private的該類變量由捎,在類初始化時實(shí)例話兔综,通過一個public的getInstance方法獲取對它的引用,繼而調(diào)用其中的方法。
public class Singleton {
private Singleton(){}
//在自己內(nèi)部定義自己一個實(shí)例狞玛,是不是很奇怪软驰?
//注意這是private只供內(nèi)部調(diào)用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進(jìn)心肪,不用每次都進(jìn)行生成對象锭亏,只是第一次
//使用時生成實(shí)例,提高了效率硬鞍!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:
定義一個類慧瘤,它的構(gòu)造函數(shù)為private的,所有方法為static的固该。
一般認(rèn)為第一種形式要更加安全些
30锅减、一個整數(shù),大于0伐坏,不用循環(huán)和本地變量怔匣,按照n,2n著淆,4n劫狠,8n的順序遞增,當(dāng)值大于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實(shí)現(xiàn)一個快速排序殖告。
交換式排序阿蝶、選擇排序、插入排序丛肮、希爾排序赡磅、快速排序
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++; //找出左邊比中間值大的數(shù)
while(strDate[j].compareTo(middle)>0&& j>left)
j--; //找出右邊比中間值小的數(shù)
if(i<=j){ //將左邊大的數(shù)和右邊小的數(shù)進(jìn)行替換
tempDate=strDate[i];
strDate[i]=strDate[j];
strDate[j]=tempDate;
i++;
j--;
}
}while(i<=j); //當(dāng)兩者交錯時停止
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魄缚、有數(shù)組a[n]宝与,用java代碼將數(shù)組元素順序顛倒
//用下面的也可以
//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循環(huán)打印九九乘法表
/**?*//**
*打印九九乘法口訣表
*/
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對象,如何轉(zhuǎn)化為”2007-3-22?20:23:22”格式的字符串嚼隘》汤铮【高達(dá)軟件】
/**?*//**
*將某個日期以固定格式轉(zhuǎn)化成字符串
*?@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、金額轉(zhuǎn)換飞蛹,阿拉伯?dāng)?shù)字的金額轉(zhuǎn)換成中國傳統(tǒng)的形式如:(¥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、寫一個方法卧檐,能夠判斷任意一個整數(shù)是否素數(shù)
/** *//**
*判斷任意一個整數(shù)是否素數(shù)
* @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個數(shù)字,用Java寫一個Main函數(shù)榜跌,打印所有不同的排序
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闪唆、寫一個方法,輸入任意一個整數(shù)钓葫,返回它的階乘
/**?*//**
*獲得任意一個整數(shù)的階乘
n
!
*/
public?int?factorial(int?num)
{
//遞歸
if(num?==?1)
{
return?1;
}
return?num*factorial(num-1);
}
40悄蕾、寫一個方法,用二分查找法判斷任意整數(shù)在任意整數(shù)數(shù)組里面是否存在础浮,若存在就返回它在數(shù)組中的索引位置笼吟,不存在返回-1
/**?*//**
*二分查找特定整數(shù)在整型數(shù)組中的位置(遞歸)
dataset
data
beginIndex
endIndex
index
*/
public?int?binarySearch(int[]?dataset,int?data,int?beginIndex,int?endIndex){
int?midIndex?=?(beginIndex+endIndex)/2;
//如果查找的數(shù)要比開始索引的數(shù)據(jù)要小或者是比結(jié)束索引的書要大,或者開始查找的索引值大于結(jié)束的索引值返回-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;
}
}
/**?*//**
*二分查找特定整數(shù)在整型數(shù)組中的位置(非遞歸)
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霸旗、如果一個序列的前四個數(shù)字分別是2,9,28,65請問第五個數(shù)字是?
13+1=2
23+1=9
32+1=28
43+1=65
所以繼續(xù)的話應(yīng)是
53+1=126
42贷帮、編寫函數(shù)找出1到1000之內(nèi)能被3整除且不是偶數(shù)的整數(shù),并按個位數(shù)的大小從大到小排序
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靴姿、設(shè)計線程的生產(chǎn)者和消費(fèi)者模式
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沃但、寫一個方法求兩個數(shù)的公約數(shù)
importjava.util.ArrayList;
importjava.util.List;
publicclassMaxNum {
intnum=0;
publicListMaxs(inta){//先找出能被第一個數(shù)整除的數(shù)
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){//找出能被第二個數(shù)整出并且也能被第二個數(shù)整除的數(shù)
num=bb;
}
}
System.out.println("最大公約數(shù)為:"+num);
}
publicstaticvoidmain(String[] args) {
newMaxNum().Test(100,1000);
}
}
47、實(shí)現(xiàn)字符串的反轉(zhuǎn)佛吓。如:abcd輸出dcba
答:
StringBufferstringBuffer =
newStringBuffer().append("abc").reverse();
System.out.println(stringBuffer.toString());
48宵晚、編寫程序?qū)⒂蓴?shù)字及字符組成的字符串中的數(shù)字截取出來并按順序輸出,例如:“ABC137GMNQQ2049PN5FFF”輸出結(jié)果應(yīng)該為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面試題大全/