面试-java算法题
1.编写一个程序,输入n,求n!(用递归的方式实现)。
public static long fac(int n){ if(n<=0) return 0; else if(n==1) return 1; else return n*fac(n-1); } public static void main(String [] args) { System.out.println(fac(6)); }
2.编写一个程序,有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
public static void main(String [] args) { int i, j, k; int m=0; for(i=1;i<=4;i++) for(j=1;j<=4;j++) for(k=1;k<=4;k++){ if(i!=j&&k!=j&&i!=k){ System.out.println(""+i+j+k); m++; } } System.out.println("能组成:"+m+"个"); }
3.编写一个程序,将text1.txt文件中的单词与text2.txt文件中的单词交替合并到text3.txt文件中。text1.txt文件中的单词用回车符分隔,text2.txt文件中用回车或空格进行分隔。
import java.io.File; import java.io.FileReader; import java.io.FileWriter; public class text{ public static void main(String[] args) throws Exception{ String[] a = getArrayByFile("text1.txt",new char[]{'\n'}); String[] b = getArrayByFile("text2.txt",new char[]{'\n',' '}); FileWriter c = new FileWriter("text3.txt"); int aIndex=0; int bIndex=0; while(aIndex<a.length){ c.write(a[aIndex++] + "\n"); if(bIndex<b.length) c.write(b[bIndex++] + "\n"); } while(bIndex<b.length){ c.write(b[bIndex++] + "\n"); } c.close(); } public static String[] getArrayByFile(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]; } return results.split(regex); } }
4.639172每个位数上的数字都是不同的,且平方后所得数字的所有位数都不会出现组成它自身的数字。(639172*639172=408540845584),类似于639172这样的6位数还有几个?分别是什么?
这题采用的HashMap结构判断有无重复,也可以采用下题的数组判断。
public void selectNum(){ for(long n = 100000; n <= 999999;n++){ if(isSelfRepeat(n)) //有相同的数字,则跳过 continue; else if(isPingFangRepeat(n*n,n)){ //该数的平方中是否有与该数相同的数字 continue; } else{ //符合条件,则打印 System.out.println(n); } } } public boolean isSelfRepeat(long n){ HashMap<Long,String> m=new HashMap<Long,String>(); //存储的时候判断有无重复值 while(n!=0){ if(m.containsKey(n%10)){ return true; } else{ m.put(n%10,"1"); } n=n/10; } return false; } public boolean isPingFangRepeat(long pingfang,long n){ HashMap<Long,String> m=new HashMap<Long,String>(); while(n!=0){ m.put(n%10,"1"); n=n/10; } while(pingfang!=0){ if(m.containsKey(pingfang%10)){ return true; } pingfang=pingfang/10; } return false; } public static void main(String args[]){ new test().selectNum(); }
5.比如,968548+968545=321732732它的答案里没有前面两个数里的数字,有多少这样的6位数。
public void selectNum(){ for(int n = 10; n <= 99;n++){ for(int m = 10; m <= 99;m++){ if(isRepeat(n,m)){ continue; } else{ System.out.println("组合是"+n+","+m); } } } } public boolean isRepeat(int n,int m){ int[] a={0,0,0,0,0,0,0,0,0,0}; int s=n+m; while(n!=0){ a[n%10]=1; n=n/10; } while(m!=0){ a[m%10]=1; m=m/10; } while(s!=0){ if(a[s%10]==1){ return true; } s=s/10; } return false; } public static void main(String args[]){ new test().selectNum(); }
6.给定String,求此字符串的单词数量。字符串不包括标点,大写字母。例如 String str="hello world hello hi";单词数量为3,分别是:hello world hi。
public static void main(String [] args) { int count = 0; String str="hello world hello hi"; String newStr=""; HashMap<String,String> m=new HashMap<String,String>(); String [] a=str.split(" "); for (int i=0;i<a.length;i++){ if(!m.containsKey(a[i])){ m.put(a[i],"1"); count++; newStr=newStr+" "+a[i]; } } System.out.println("这段短文单词的个数是:"+count+","+newStr); }
7.写出程序运行结果。
public class Test1 { private static void test(int[]arr) { for (int i = 0; i < arr.length; i++) { try { if (arr[i] % 2 == 0) { throw new NullPointerException(); } else { System.out.print(i); } } catch (Exception e) { System.out.print("a "); } finally { System.out.print("b "); } } } public static void main(String[]args) { try { test(new int[] {0, 1, 2, 3, 4, 5}); } catch (Exception e) { System.out.print("c "); } } }
运行结果:a b 1b a b 3b a b 5b
public class Test1 { private static void test(int[]arr) { for (int i = 0; i < arr.length; i++) { try { if (arr[i] % 2 == 0) { throw new NullPointerException(); } else { System.out.print(i); } } finally { System.out.print("b "); } } } public static void main(String[]args) { try { test(new int[] {0, 1, 2, 3, 4, 5}); } catch (Exception e) { System.out.print("c "); } } }
运行结果:b c
8.单词数
统计一篇文章里不同单词的总数。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组值输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
public static void main(String [] args) { List<Integer> countList=new ArrayList<Integer>(); int count; HashMap<String,String> m; String str; //读取键盘输入的一行(以回车换行为结束输入) String[] a; Scanner in=new Scanner(System.in); while( !(str=in.nextLine()).equals("#") ){ a=str.split(" "); m=new HashMap<String,String>(); count = 0; for (int i=0;i<a.length;i++){ if(!m.containsKey(a[i]) && (!a[i].equals(""))){ m.put(a[i],"1"); count++; } } countList.add(count); }s for(int c:countList) System.out.println(c); }