笔试强训(8)

笔试题1:密码强度等级密码强度等级_牛客题霸_牛客网

在这个题中:

1)统计密码的长度直接通过length()来进行解决

2)统计大写字母和小写字母的个数分别在函数里面定义两个变量来进行解决

3)统计数字和富豪也是分别用两个变量来进行保存

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String str=scanner.nextLine();
            int sum1=getLength(str);//长度的总分数
            int sum2=getChar(str);//字符串中拥有字母的总分数
            int sum3=getDig(str);//字符串中拥有数字的总分数
            int sum4=getSym(str);//字符串中拥有其他符号的总分数
            int result=sum1+sum2+sum3+sum4;
            if(sum4!=0&&sum2==20&&sum3!=0){//这个条件应该写在最前面
                result=result+5;
            }else if(sum3!=0&&sum2!=0&&sum4!=0){
                result=result+3;
            }else if(sum4==0&&sum2!=0&&sum3!=0){
                result=result+2;
            }
            // System.out.println(result);
            if(result>=90){
                System.out.println("VERY_SECURE");
            }else if(result>=80&&result<90){
                System.out.println("SECURE");
            }else if(result>=70&&result<80){
                System.out.println("VERY_STRONG");
            }else if(result>=60&&result<70){
                System.out.println("STRONG");
            }else if(result>=50&&result<60){
                System.out.println("AVERAGE");
            }else if(result>=25&&result<50){
                System.out.println("WEAK");
            }else{
                System.out.println("VERY_WEAK");
            }
        }

    }
    public static int getLength(String str){
        int sum=0;
        if(str.length()<=4){
            sum=5;
        }else if(str.length()>=5&&str.length()<=7){
            sum=10;
        }else if(str.length()>=8){
            sum=25;
        }
        return sum;
    }
    public static int getChar(String str){
        int BigChar=0;
        int ShortChar=0;
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            if(ch>='a'&&ch<='z') ShortChar++;
            if(ch>='A'&&ch<='Z') BigChar++;
        }
        if(BigChar==0&&ShortChar==0){
            return 0;
        }else if(BigChar>0&&ShortChar==0){
            return 10;
        }else if(BigChar==0&&ShortChar>0){
            return 10;
        }else{
            return 20;
        }
    }
    public static int getDig(String str){
        int count=0;
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            if(ch-'0'>=0&&'9'-ch>=0){
                count++;
            }
        }
        if(count==0) return 0;
        else if(count==1) return 10;
        else return 20;
    }
    public static int getSym(String str){
        int sum=0;
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            if(!(ch>=65&&ch<=90)&&!(ch>=97&&ch<=122)&&!(ch>='0'&&        ch<='9')){
                sum++;
            }
        }
        if(sum==0) return 0;
        if(sum==1) return 10;
        else return 25;
    }
}

笔试题2:井字棋井字棋__牛客网

给定一个二维数组,代表棋盘,当前元素为1的是代表当前玩家的棋子,0表示没有棋子,-1代表对方玩家的棋子,当一方棋子在横斜竖方向上面有连成排的就获胜,判断当前玩家是否胜出

输入用例:[[1,0,1],[1,-1,-1],[1,-1,0]]

做题思路:

1)先进行判断每一行相加是否等于每一行的行数,如果等于行数,那么就说明全部是1,那么结果胜利

2)我们在进行判断每一列相加是否等于每一行的列数,如果等于列数,那么就说明这一列的每一个元素全部是1,那么胜利,如果全部是-1,那么结果失败

3)同样我们可以用同样的方式来进行判断主对角线上面的元素和副对角线上面的元素

import java.util.*;

public class Board {
    public boolean checkWon(int[][] array) {
        int vectory=0;
        int defeat=0;
         int m=array.length;//表示行
        int n=array[0].length;//表示列
//1我们让每一行i先固定不动,这样就可以算出每一行的总和
      for(int i=0;i<m;i++){//行
          vectory=0;
          defeat=0;
          for(int j=0;j<n;j++){//列
          vectory=vectory+array[i][j];
          defeat=defeat+array[i][j];
          }
          if(vectory==m) return true;
          if(defeat==-m) return false;
      }
//2.我们可以让每一列j固定不动,这样就可以算出每一列的总和
    for(int j=0;j<n;j++){
           vectory=0;
           defeat=0;
        for(int i=0;i<m;i++){
            vectory=vectory+array[j][i];
            defeat=defeat+array[j][i];
        }
         if(vectory==n) return true;
         if(defeat==-n) return false;
    }
             vectory=0;
             defeat=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==j){
                     vectory=vectory+array[i][j];
                     defeat=defeat+array[i][j];
                }
                
            }
        }
         if(vectory==n) return true;
         if(defeat==-n) return false;
             vectory=0;
             defeat=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i+j+1==m){
                     vectory=vectory+array[i][j];
                     defeat=defeat+array[i][j];
                }
            }
        }
         if(vectory==n) return true;
         if(defeat==-n) return false;
        return false;
    } 
}

笔试题3:最近公共祖先最近公共祖先__牛客网

题目描述:将一颗无穷大的满二叉树的结点按照根节点一层一层的从左向右编号,根节点编号是1,现在我们给定a,b两个节点,设计一个算法,返回最近a,b公共祖先的编号,注意其祖先也有可能是节点本身:

输入用例:2,3

返回:1

满二叉树:每一层节点都达到了最大节点数

原来这一颗二叉树是一个固定的二叉树,具体他是长成这样子的

思路:每一次让最大的数除以2,看看是否结果等于另一个数

1)如果说我们题目的具体输入是a==b,那么最近公共祖先就是a/2

2)假设如果说现在a!=b,那么此时举个例子吧:

假设现在题目输入了两个值:a=7,b=4;

1)让这两个数中比较大的值/2=>a=a/2=3;

2)我们在让这两个数中较大的值除以2,所以就可以得出:b=b/2=2;

3)我们在让这两个数种比较大的值除以2,a=a/2=1;

4)b=b/2=1,所以他们的最近公共祖先就是1;

public class LCA {
    public int getLCA(int a, int b) {
      if(a==b){
          return a;
      }
        while(true){
            if(a>b){
                a=a/2;
            }else{
                b=b/2;
            }
            if(a==b){
                break;
            }
        }
        return a;
    }
}

笔试题4:求最大连续bit数_牛客题霸_牛客网

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
          int max=0;
          int count=0;
          for(int i=0;i<31;i++){
                if(((n>>i)&1)==1){
                    count++;
                    if(count>max){
                        max=count;
                    }
                }else{
                    count=0;
                }
           }
    System.out.println(max);
        }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值