java笔试手写算法面试题大全含答案

互联网 19-11-7

1.统计一篇英文文章单词个数。

public class WordCounting {     public static void main(String[] args) {         try(FileReader fr = new FileReader("a.txt")) {             int counter = 0;             boolean state = false;             int currentChar;             while((currentChar= fr.read()) != -1) {                 if(currentChar== ' ' || currentChar == '\n'                         || currentChar == '\t' || currentChar == '\r') {                     state = false;                 }                 else if(!state) {                     state = true;                     counter++;                 }             }             System.out.println(counter);         }         catch(Exception e) {             e.printStackTrace();         }     } }

补充:这个程序可能有很多种写法,这里选择的是Dennis M. Ritchie和Brian W. Kernighan老师在他们不朽的著作《The C Programming Language》中给出的代码,向两位老师致敬。下面的代码也是如此。

2.输入年月日,计算该日期是这一年的第几天。

public class DayCounting {     public static void main(String[] args) {         int[][] data = {                 {31,28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},                 {31,29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}         };         Scanner sc = new Scanner(System.in);         System.out.print("请输入年月日(1980 11 28): ");         int year = sc.nextInt();         int month = sc.nextInt();         int date = sc.nextInt();         int[] daysOfMonth = data[(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)?1 : 0];         int sum = 0;         for(int i = 0; i < month -1; i++) {             sum += daysOfMonth[i];         }         sum += date;         System.out.println(sum);         sc.close();     } }

3.回文素数:所谓回文数就是顺着读和倒着读一样的数(例如:11,121,1991…),回文素数就是既是回文数又是素数(只能被1和自身整除的数)的数。编程找出11~9999之间的回文素数。

public class PalindromicPrimeNumber {     public static void main(String[] args) {         for(int i = 11; i <= 9999; i++) {             if(isPrime(i) && isPalindromic(i)) {                 System.out.println(i);             }         }     }     public static boolean isPrime(int n) {         for(int i = 2; i <= Math.sqrt(n); i++) {             if(n % i == 0) {                 return false;             }         }         return true;     }     public static boolean isPalindromic(int n) {         int temp = n;         int sum = 0;         while(temp > 0) {             sum= sum * 10 + temp % 10;             temp/= 10;         }         return sum == n;     } }

4.全排列:给出五个数字12345的所有排列。

public class FullPermutation {     public static void perm(int[] list) {         perm(list,0);     }     private static void perm(int[] list, int k) {         if (k == list.length) {             for (int i = 0; i < list.length; i++) {                 System.out.print(list[i]);             }             System.out.println();         }else{             for (int i = k; i < list.length; i++) {                 swap(list, k, i);                 perm(list, k + 1);                 swap(list, k, i);             }         }     }     private static void swap(int[] list, int pos1, int pos2) {         int temp = list[pos1];         list[pos1] = list[pos2];         list[pos2] = temp;     }     public static void main(String[] args) {         int[] x = {1, 2, 3, 4, 5};         perm(x);     } }

5.对于一个有N个整数元素的一维数组,找出它的子数组(数组中下标连续的元素组成的数组)之和的最大值。

下面给出几个例子(最大子数组用粗体表示):

数组:{ 1, -2, 3,5, -3, 2 },结果是:8

2) 数组:{ 0, -2, 3, 5, -1, 2 },结果是:9

3) 数组:{ -9, -2,-3, -5, -3 },结果是:-2

可以使用动态规划的思想求解:

public class MaxSum {     private static int max(int x, int y) {         return x > y? x: y;     }     public static int maxSum(int[] array) {         int n = array.length;         int[] start = new int[n];         int[] all = new int[n];         all[n - 1] = start[n - 1] = array[n - 1];         for(int i = n - 2; i >= 0;i--) {             start[i] = max(array[i], array[i] + start[i + 1]);             all[i] = max(start[i], all[i + 1]);         }         return all[0];     }     public static void main(String[] args) {         int[] x1 = { 1, -2, 3, 5,-3, 2 };         int[] x2 = { 0, -2, 3, 5,-1, 2 };         int[] x3 = { -9, -2, -3,-5, -3 };         System.out.println(maxSum(x1)); // 8         System.out.println(maxSum(x2)); // 9         System.out.println(maxSum(x3)); //-2     } }

6.用递归实现字符串倒转

public class StringReverse {     public static String reverse(String originStr) {         if(originStr == null || originStr.length()== 1) {             return originStr;         }         return reverse(originStr.substring(1))+ originStr.charAt(0);     }     public static void main(String[] args) {         System.out.println(reverse("hello"));     } }

7.输入一个正整数,将其分解为素数的乘积。

public class DecomposeInteger {     private static List<Integer> list = new ArrayList<Integer>();     public static void main(String[] args) {         System.out.print("请输入一个数: ");         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         decomposeNumber(n);         System.out.print(n + " = ");         for(int i = 0; i < list.size() - 1; i++) {             System.out.print(list.get(i) + " * ");         }         System.out.println(list.get(list.size() - 1));     }     public static void decomposeNumber(int n) {         if(isPrime(n)) {             list.add(n);             list.add(1);         }         else {             doIt(n, (int)Math.sqrt(n));         }     }     public static void doIt(int n, int div) {         if(isPrime(div) && n % div == 0) {             list.add(div);             decomposeNumber(n / div);         }         else {             doIt(n, div - 1);         }     }     public static boolean isPrime(int n) {         for(int i = 2; i <= Math.sqrt(n);i++) {             if(n % i == 0) {                 return false;             }         }         return true;     } }

8、一个有n级的台阶,一次可以走1级、2级或3级,问走完n级台阶有多少种走法。

public class GoSteps {     public static int countWays(int n) {         if(n < 0) {             return 0;         }         else if(n == 0) {             return 1;         }         else {             return countWays(n - 1) + countWays(n - 2) + countWays(n -3);         }     }     public static void main(String[] args) {         System.out.println(countWays(5)); // 13     } }

public class AllNotTheSame {     public static boolean judge(String str) {         String temp = str.toLowerCase();         int[] letterCounter = new int[26];         for(int i = 0; i <temp.length(); i++) {             int index = temp.charAt(i)- 'a';             letterCounter[index]++;             if(letterCounter[index] > 1) {                 return false;             }         }         return true;     }     public static void main(String[] args) {         System.out.println(judge("hello"));         System.out.print(judge("smile"));     } }

10.有一个已经排好序的整数数组,其中存在重复元素,请将重复元素删除掉,例如,A= [1, 1, 2, 2, 3],处理之后的数组应当为A= [1, 2, 3]。

public class RemoveDuplication {     public static int[] removeDuplicates(int a[]) {         if(a.length <= 1) {             return a;         }         int index = 0;         for(int i = 1; i < a.length; i++) {             if(a[index] != a[i]) {                 a[++index] = a[i];             }         }         int[] b = new int[index + 1];         System.arraycopy(a, 0, b, 0, b.length);         return b;     }     public static void main(String[] args) {         int[] a = {1, 1, 2, 2, 3};         a = removeDuplicates(a);         System.out.println(Arrays.toString(a));     } }

11.给一个数组,其中有一个重复元素占半数以上,找出这个元素。

public class FindMost {     public static <T> T find(T[] x){         T temp = null;         for(int i = 0, nTimes = 0; i< x.length;i++) {             if(nTimes == 0) {                 temp= x[i];                 nTimes= 1;             }             else {                 if(x[i].equals(temp)) {                     nTimes++;                 }                 else {                     nTimes--;                 }             }         }         return temp;     }     public static void main(String[] args) {         String[]strs = {"hello","kiss","hello","hello","maybe"};         System.out.println(find(strs));     } }

12.编写一个方法求一个字符串的字节长度?

public int getWordCount(String s){     int length = 0;     for(int i = 0; i < s.length(); i++)     {         int ascii = Character.codePointAt(s, i);         if(ascii >= 0 && ascii <=255)             length++;         else             length += 2;     }     return length; }

以上就是java笔试手写算法面试题大全含答案的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: java
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:java判断特定值是否在数组中的方法

相关资讯