【JAVA】每日练习——03

本文精选了八个编程题目,包括走方格的方案数、另类加法、密码强度等级等,涉及递归算法、二进制操作、字符串处理等多个方面,提供详细的解析与Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

二、【编程题】走方格的方案数

三、【编程题】 另类加法

四、【编程题】 密码强度等级


二、【编程题】走方格的方案数

走方格

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

注:沿棋盘格之间的边缘线行走

输入描述:

输入两个正整数n和m,用空格隔开。(1≤n,m≤8)

输出描述:

输出一行结果                如:输入:2  2---->6

 解析:总路径:n,m)=(n-1,m)+(n,m-1) ---->使用递归

2.当n==1 && m>= 1------>对应路径数n+m;

3.当m==1 && n>= 1------>对应路径数n+m

终止条件m,n = 1

4.当m,n都>1时,如下情况:每走一步有两种情况,因此用递归方法来实现

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {  //多组样例,因此需要循环读入
            int n = in.nextInt();
            int m = in.nextInt();
            System.out.println(func(n,m));
        }
    }

    public static int func(int n,int m) {  //处理输入的两个数据,递归函数
        if((n == 1 && m >=1) || (m == 1 && n >=1)) {
            return m+n;
        }
        return func(n-1,m)+func(n,m-1); 
    }
}

三、【编程题】 另类加法

另类加法

给定两个int AB。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。

解析:二进制位异或运算相当于对应位相加,不考虑进位
1.如: 1 ^ 1 = 0 ---> 1 + 1 = 0 (当前位值为0,进一位)
           1 ^ 0 = 1 ---> 1 + 0 = 1 (当前位值为1)
           0 ^ 0 = 0 ---> 0 + 0 = 0 (当前位值为0)
2. 二进制位与运算左移一位相当于对应位相加之后的进位
如:  1 & 1 = 1 ---> 1 + 1 = 0 (当前位的值进一位)
         1 & 0 = 0 ---> 1 + 0 = 1 (当前位的值不进位)
         0 & 0 = 0 ---> 0 + 0 = 0 (当前位的值不进位)

结论:两个数相加:二进制位相加的结果 + 进位的结果

若不需进位:两数相加=异或结果

若需进位:两数相加=异或结果 + 进位的结果
如:   3 + 2 --> 0011 + 0010 --> 0011 ^ 0010 + ((0011 & 0010) << 1)
          ---> (0011 ^ 0010) ^ ((0011 & 0010) << 1), 当进位之后的结果为0时,相加结束

import java.util.*;

public class UnusualAdd {
    public int addAB(int A, int B) {
        if(B == 0) return A;
        int sum = 0;
        int ret = 0;
//若不需进位:两数相加=异或结果
//若需进位:两数相加=异或结果 + 进位的结果
        while( B!= 0) {
            sum = A^B;  // sum接受异或的结果   A异或B(全1为0,全0为0)
            ret = (A & B) << 1;  //ret接收与运算结果左移以为的结果--> AB与运算,结果左移一位(全1为1)
            A = sum;
            B = ret;
        }
        return A;
    }
}   

四、【编程题】 密码强度等级

密码强度等级

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

输入描述:

输入一个string的密码

输入描述:

输出密码等级

解析:

1.现根据各种得分情况写出相应的子函数,然后在主函数根据根据评分标准进行调用

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 当有多组输入时,需要使用while循环
            String str = in.nextLine();
            int sum = 0;
            int sum1 = getlen(str); 
            int sum2 = getword(str);
            int sum3 = getNum(str);
            int sum4 = getchar(str);

            if(sum2 == 20 && sum3 >= 1 && sum4 >= 1) {  //   大小写字母、数字和符号,  奖励5分
                sum = sum1 + sum2 + sum3 + sum4 + 5;    
            } else if(sum2 == 10 && sum3 >= 1 && sum4 >= 1) {   //字母、数字和符号  奖励3分
                sum = sum1 + sum2 + sum3 + sum4 + 3; 
            }else if(sum2 == 10 && sum3 >= 1 && sum4 == 1) {  // 字母和数字   奖励2分
                 sum = sum1 + sum2 + sum3 + sum4 + 2; 
            }else {
                sum = sum1 + sum2 + sum3 + sum4; 
            }

            if(sum >= 90) {      //输出评分标准
                System.out.println("VERY_SECURE");
            }else if(sum >= 80) {
                System.out.println("SECURE");
            }else if(sum >= 70) {
                System.out.println("VERY_STRONG");
            }else if(sum >= 60) {
                System.out.println("STRONG");
            }else if(sum >= 50) {
                System.out.println("AVERAGE");
            }else if(sum >= 25) {
                System.out.println("WEAK");
            }else if(sum >= 0) {
                System.out.println("VERY_WEAK");
            }
        }
    }

    public static int getlen(String str) {  //判断密码长度
        if(str.length() <= 4) {
            return 5;
        }else if(str.length() >= 5 &&str.length() <= 7){
            return 10;
        }else if(str.length() >= 8) {
            return 25;
        }else {
            return 0;
        }
    }

    public static int getword(String str) {   //大写字母A-Z:65~90   判断密码包含的数目多少
        int small = 0;
        int big = 0;
        for(int i = 0;i < str.length();i++) {
            if(str.charAt(i) >= 65 && str.charAt(i) <= 90) {  //说明·是大写字母,并对其进行计数
                big++;
            }else if(str.charAt(i) >= 97 && str.charAt(i) <= 122) {  //说明·是小写字母 ,对其进行计数
                small++;
            }
        }
        if(small > 0 && big > 0) {  // 大小写字母都有,获取20分
            return 20;
        }else if(small > 0 || big > 0) {  //只有其中一种,得10分
            return 10;
        }else {    //不含字母
            return 0;
        }

    }

    public static int getNum(String str) {  //判断数字
        int count = 0;
        for(int i =0; i < str.length();i++) {
            if(str.charAt(i)-'0' >= 0 && str.charAt(i)-'0' <=9) {
                count++;
            }
        }
        if(count == 1) {
            return 10;
        }else if(count > 1) {
            return 20;
        }else {   //等于0和不包含数字的情况
            return 0; 
        }
    }

    public static int getchar(String str) { //判断符号
        int count = 0;
        for(int i = 0; i < str.length();i++) {  //符号指的是:非数字、非大小写字母
            if(!(str.charAt(i) >= 65 && str.charAt(i) <= 90) &&       //非大写字母
               !(str.charAt(i) >= 97 && str.charAt(i) <= 122) &&      //非小写字母
               !(str.charAt(i)-'0' >= 0 && str.charAt(i)-'0' <=9)) {   // 非数字
               count++;
            }
        }
        if(count == 1) return 10;
        if(count  > 1) {
            return 25;
        }else {
            return 0;
        }
    }
}

五、【编程题】井字棋

牛客_井字棋

给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。

测试样例:

[[1,0,1],[1,-1,-1],[1,-1,0]]

返回:true

解析:只需找到各个点的位置坐标即可,满足三条线的要求即可获胜

1.判断行:某一行元素和为n,即当前玩家胜出,返回true

2.判断列:某一列元素和为n,即当前玩家胜出,返回true

3.判断主对角线:对角线元素和为n,即当前玩家胜出,返回true

import java.util.*;

public class Board {
    public boolean checkWon(int[][] board) {
        int n = board.length;  //n为输入维度
        // int i = 0;
        // int j = 0;
        int sum = 0;
        for(int i = 0; i < n;i++) {  // 检查行 是否满足
            for(int j = 0; j < n;j++) {
                sum += board[i][j];
            }
            if(sum == n) {
                return true;
            }
        }
        for(int i = 0; i < n;i++) {  // 检查列 是否满足
            for(int j = 0; j < n;j++) {
                sum +=  board[j][i];
            }
            if(sum == n) {
                return true;
            }
        }

        for(int i = 0; i < n;i++) {  // 检查主对角线 是否满足
            sum += board[i][i];
            if(sum == n) {
                return true;
            }
        }

        for(int i = 0; i < n;i++) {  // 检查副对角线 是否满足
            sum += board[i][n-1-i];
            if(sum == n) {
                return true;
            }
        }
        return false;
    }
}   

六、【编程题】最近公共祖先

将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。

测试样例:

2,3    返回:1

解析:

1.父亲节点:parent = child / 2

2.只有当输入ab的节点位于同一节点下之后

import java.util.*;
public class LCA {
    public int getLCA(int a, int b) {
        if(a == b) return a;
        int parent = 0;
        while(a/2 != b/2) {   //对大的数求父节点,直到两个节点位于同一个节点下就找到了最近公共祖先
            if(a > b) {  
                parent = a / 2; //求a的parent 
                a = parent;
            }else {
                parent = b /2;
                b = parent;
            }
        }
        return a/2;  //返回父节点(此时也是公共祖先)
    }
}

七、【编程题】 求最大连续bit数

求一个int类型数字对应的二进制数字中1的最大连续数

输入描述:

输入一个int类型数字

输出描述:

输出转成二进制之后连续1的个数

如:3的二进制为00000011,最大连续2个1

解析:1.首先完成十进制到二进制的转化:Integer.toBinaryString(n)

2.然后再求二进制数字中不同段1的个数,取最大值

import java.util.Scanner;

public class Main {
   
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            String str = Integer.toBinaryString(n);  //把10进制n转化为二进制字符串
            String[] arr = str.split("0");   //用0分割字符串,将其转化为字符串数组
             int len = 0;
            for (String value : arr) {//把每一段字符串给value---->valur=arr[i]
                if (value.length() > len) {//统计最大值
                    len = value.length();
                }
            }
            System.out.println(len);
        }
    }
}

八、【编程题】二进制插入

二进制插入__牛客网

给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。

样例:

1024,19,2,6

返回:1100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值