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


    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 == ' '
    || currentChar == ' ' || currentChar == ' ') {
    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
    }
    }

    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实现蓝桥杯七对数字
    Java实现蓝桥杯七对数字
    ubuntu下交叉编译windows c程序
    Linux下开发Windows平台运行的程序
    Fedora 11中用MinGW编译Windows的Qt4程序(在Linux系统下编译Windows的程序)
    C++内存问题大集合(指针问题,以及字符串拷贝问题,确实挺危险的)
    C/C++的编译器|编译环境(非常全面的比较)
    关于 js 中的 call 和 apply使用理解
    看我如何应对业务需求变化,领域模型调整?
    MVC 用扩展方法执行自定义视图,替代 UIHint
  • 原文地址:https://www.cnblogs.com/Yanss/p/11711909.html
Copyright © 2020-2023  润新知