想学习算法?Java笔试手写算法面试12题『含答案』整的明明白白

107 篇文章 0 订阅
6 篇文章 0 订阅

本文转载自:想学习算法?Java笔试手写算法面试12题『含答案』整的明明白白


前言:

我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的的知识和面试经验,为将来进入更好的工作做好充分的准备!

算法面试题+答案

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
  • 数组:{ 0, -2, 3, 5, -1, 2 },结果是:9
  • 数组:{ -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
	}
}

9. 写一个算法判断一个英文单词的所有字母是否全都不同(不区分大小写)

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笔试手写算法面试12题『含答案』整的明明白白

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值