JAVA程序员面试题:编程题

目录

1、古典问题:不死兔子

2、判断是不是素数

3、判断是不是回文数

4、判断是不是水仙花数

5、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

6、输入两个正整数m和n,求其最大公约数和最小公倍数。

7、求一行字符,分别统计出其英文字母、空格、数字和其它字符的个数。

8、数组排序

9、字符串逆序

10、完数,除它本身的因数相加等于它自己,如: 6=1+2+3

11、统计字符串中子串出现的次数

12、一球从h米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?

13 猴子吃桃问题



1、古典问题:不死兔子

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

公式:a[n]=a[n-1]+a[n-1]

//使用递归求解
private static int fun(int n){
   if(n==1 ||n==2)
      return 1;
   else
      return fun(n-1)+fun(n-2);
}

2、判断是不是素数

private static boolean IsRightNum(int i) {
   for (int j = 2; j < Math.sqrt(i);j++) {
        //如果能整除,就说明不是素数,可以马上中断,继续对下一个数判断
       if (i%j==0) { 
          return false;
       }
   }     
   return true;
}

3、判断是不是回文数

public static boolean palindrom(Integer num) {
        String s1 = String.valueOf(num);
        String s2 = new StringBuilder(s1).reverse().toString();
        return s1.equals(s2);
}

4、判断是不是水仙花数

private static boolean IsRightNum(int i) {
    //百位
    int a = i/100;
    //十位 int b = i/10%10
    int b = i%100/10;
    //个位
    int c = i%10;
    if((a*a*a)+(b*b*b)+(c*c*c)==i)
        return true;
    return false;
}

5、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

思路:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
如果它可以整除4,那么它一定可以整除2,被除数不断判断累加上去可以保证绝对不会错过。最后i和num相等是就跳出循环,增加最后的结果质数。

public static void decomposeNum(int num){
        int res = num;
        StringBuilder s = new StringBuilder();
        for (int i = 2; i <= num; i++) {
            while (num%i==0&&i!=num){
                num/=i;
                s.append(i+"*");
            }
        }
        s.append(num+"="+res);
        System.out.println(s.toString());
}

6、输入两个正整数m和n,求其最大公约数和最小公倍数。

思路:
最大公约数:几个数共有因数中最大的一个。如:12和18。12的因数有:1、12、2、6、3、4。18的因数有1、18、2、9、3、6。共有的因数:1、2、3、6。所以6就是12和18的最大公因数。
最小公倍数:几个数公有的倍数中最小的一个。如4的倍数有4、8、12、16...;6的倍数有6,12,18...;则最小公倍数是12。
最大公约数和最小公倍数的求法:先求最大公约数,就可以很方便获得最小公倍数。最小公倍数=两数乘积/最大公约数。最小公倍数就不展示代码,直接代入公式计算即可。
求最大公约数的方法:
(1)用大的数对小的数求余
(2)把小的数赋值给大的数,把求余获得的结果赋值给小的数
(3)循环上一步的操作,直到求余的结果为零
(4)最后一步的被除数就是最大公约数

public static void decomposeNum(int a,int b){
    //保证a大于b,否则就交换位置,否则后续无法取余。
    if (a<b){
        int i = a;
        a=b;
        b=i;
    }
    while (a%b!=0){
        int c = a%b;
        a = b;
        b = c;
    }
    return b;
}

7、求一行字符,分别统计出其英文字母、空格、数字和其它字符的个数。

str.length()-str.replaceAll("[a-zA-Z]","").length();
str.length()-str.replaceAll(" ","").length();
str.length()-str.replaceAll("\\d","").length();
str.length()-str.replaceAll("[^a-zA-Z]\\d ","").length();

8、数组排序

public static Integer[] sortByArrays(Integer... arr) {
        //降序
        Arrays.sort(arr,(x, y) -> y - x);
        //升序
        Arrays.sort(arr);
        //倒序
        List<Integer> list = Arrays.asList(arr);
        Collections.reverse(list);
        return list.toArray(new Integer[arr.length]);
        
        return arr;
}

9、字符串逆序

StringBuilder.reverse()或者StringBuffer.reverse()


10、完数,除它本身的因数相加等于它自己,如: 6=1+2+3

private static boolean IsRightNum(int i) {
        int sum = 0;
        for (int j = 1; j <= i/2;j++) {
            if (i%j==0) {
                sum+=j;
            }
        }
        if (sum==i) {
            return true;
        }
        return false;
}

11、统计字符串中子串出现的次数

String.indexOf(String str),返回此字符串中第一次出现指定子字符串的索引。
str = str.substring(i + s.length());
count++;

12、一球从h米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?

public static double[] pinBall(double h, int n) {
    double s = h;
    for (int i = 1; i < n; i++) {
        h = h / 2;
        s += 2 * h;
    }
    return new double[]{s, h};
}


13 猴子吃桃问题

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下 的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少。
逆向思维:剩下的加一个就是前一天的一半。剩下的加一乘以2就是前一天的总量

public static int peach(int dayNum) {
    int total = 1;
    for (int day = 1; day < dayNum; day++) {
        total = 2 * (total + 1);
    }
    return total;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值