【nowcoder】笔试强训Day10

目录

一、选择题

二、编程题

2.1井字棋

2.2密码强度等级


一、选择题

1.下列运算符合法的是( )

A. &&

B. <>

C. if

D. :=

逻辑与&&语法规则:表达式1&&表达式2,其中两个表达式都是布尔表达式,得到的结果也是布尔值。

所以正确答案是

2.下面代码运行结果是()

public class Test{
    public int add(int a,int b){
        try {
            return a+b;
         }
        catch (Exception e) {
            System.out.println("catch语句块");
        }
        finally{
            System.out.println("finally语句块");
        }
        return 0;
    }
    public static void main(String argv[]){
        Test test =new Test();
        System.out.println("和是:"+test.add(9, 34));
    }
}

A. catch语句块 和是:43

B. 编译异常

C. finally语句块 和是:43

D. 和是:43 finally语句块

在try-catch-finally代码块中,catch代码块只有在捕捉到异常的时候才会执行,而finally代码块一定会执行,所以先执行finally代码块再进行返回。

所以正确答案是

3.下列Java代码中的变量a、b、c分别在内存的____存储区存放。

class A {
    private String a = “aa”;
    public boolean methodB() {
        String b = “bb”;
        final String c = “cc”;
    }
}

A. 堆区、堆区、堆区

B. 堆区、栈区、堆区

C. 堆区、栈区、栈区

D. 堆区、堆区、栈区

E. 静态区、栈区、堆区

F. 静态区、栈区、栈区

a是全局变量存放在堆区,b是局部变量也存放在堆区,c是String类型的变量是引用类型存放在栈区。

所以正确答案是

4.以下声明合法的是

A. default String s

B. public final static native int w( )

C. abstract double d

D. abstract final double hyperbolicCosine( ) 

属性的可访问控制符可以是public、protected、private、默认(即default)default修饰符不能直接写出·,所以A是错的。B中定义的是本地方法,从修饰符native可以看出来,被native修饰的方法,底层是C++。属性的非可访问控制符可以是static和final,没有abstract,所以C是错的。abstract不可以和static以及final连用,abstract是虚拟的动态的,但是static和final都是静态的所以D是错的。

所以正确答案是 B 

5.在使用super 和this关键字时,以下描述正确的是

A. 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过

B. super()和this()不一定要放在构造方法内第一行

C. this()和super()可以同时出现在一个构造函数中

D. this()和super()可以在static环境中使用,包括static方法和static语句块 

this()和super()都必须写在第一行,所以两者不能那个写在一个构造函数中,并且两者都不能那个在静态环境中使用,是需要对象引用的。

所以正确答案是 A 

6.下面代码的输出结果是什么?

public class ZeroTest {
    public static void main(String[] args) {
        try{
            int i = 100 / 0;
            System.out.print(i);
        }catch(Exception e){
            System.out.print(1);
            throw new RuntimeException();
        }finally{
            System.out.print(2);
        }
        System.out.print(3);
    }
}

A. 3

B. 123

C. 1

D.12

在try-catch-finally代码块中,如果catch捕捉到了异常就会执行,在本题中就捕捉到了异常,除数不能为0的异常所以输出1,然后finally代码一定会执行,并且后面的代码块就不会再执行了,所以输出2。

所以正确答案是 D 

7.有代码片段如下:

byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);

关于上面代码片段叙述正确的是()

A. 输出结果:13

B. 语句:b6=b4+b5编译出错

C. 语句:b3=b1+b2编译出错

D.运行期抛出异常

是第四行语句出现错误,从int转换到byte可能会有损失

所以正确答案是 C 

8.以下java程序代码,执行后的结果是()

public class Test {
    public static void main(String[] args) {
        Object o = new Object() {
            public boolean equals(Object obj) {
                return true;
            }
        };
        System.out.println(o.equals("Fred"));
    }
}

A. Fred

B. true

C. 编译错误

D. 运行时抛出异常

在本题中创建了Object类对象,方法输出了true

所以正确答案是 B 

9.执行以下程序后的输出结果是()

public class Test {
    public static void main(String[] args) {
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        operator(a, b);
        System.out.println(a + "," + b);
    }
    public static void operator(StringBuffer x, StringBuffer y) {
        x.append(y); y = x;
    }
}

A. A,A

B. A,B

C. B,B

D.AB,B

在operator方法中,x是直接改变了引用对象,所以主方法中的a也会改变,y也就是b并没有实质性的改变

所以正确答案是 D 

10.下面所示的java代码,运行时,会产生()类型的异常

int Arry_a[] = new int[10];
System.out.println(Arry_a[10]);

A. ArithmeticException

B. NullPointException

C. IOException

D.ArrayIndexOutOfBoundsException

本题中数组是有十个元素,下标从0-9是合法的,调用10下标即产生数组越界异常

所以正确答案是 D 

二、编程题

2.1井字棋

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

 在本题中有四种情况。

第一种是行成排,即i不变,j++,然后将每个board[i][j]值相加存储,如果结果==size,那么就成排。

第二种是列成排,即i不变,j++,然后将numboard[ j ][ i ]值相加存储,如果结果==size,那么就成排。

第三种是正的对角线,即i++,然后将numboard[ i ][ i ]值相加存储,如果结果==size,那么就成排。

第四种是反的对角线,即i++,然后将numboard[ i ][ size-i-1 ]值相加存储,如果结果==size,那么就成排。

public class Board {
    public boolean checkWon(int[][] board) {
        int size = board.length;
        int sum = 0;
        for(int i = 0;i<size;i++){
            sum = 0;
            for(int j = 0;j<size;j++){
                sum+=board[i][j];
            }
            if(sum==size){
                return true;
            }
        }
        for(int i = 0;i<size;i++){
            sum = 0;
            for(int j = 0;j<size;j++){
                sum+=board[j][i];
            }
            if(sum==size){
                return true;
            }
        }
        sum = 0;
        for(int i = 0;i<size;i++){
            sum+=board[i][i];
        }
        if(sum==size){
            return true;
        }
        sum = 0;
        for(int i = 0;i<size;i++){
            sum+=board[i][size-i-1];
        }
        if(sum==size){
            return true;
        }
        return false;
    }
}

2.2密码强度等级

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

一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 密码里的字母全都是小(大)写字母
20 分: 密码里的字母符合”大小写混合“
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励(只能选符合最多的那一种奖励):
2 分: 字母和数字
3 分: 字母、数字和符号

5 分: 大小写字母、数字和符号

最后的评分标准:
>= 90: 非常安全
>= 80: 安全(Secure)
>= 70: 非常强
>= 60: 强(Strong)
>= 50: 一般(Average)
>= 25: 弱(Weak)
>= 0:  非常弱(Very_Weak)
对应输出为:
VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK
请根据输入的密码字符串,进行安全评定。
注:
字母:a-z, A-Z
数字:0-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./     (ASCII码:0x21~0x2F)
:;<=>?@             (ASCII码:0x3A~0x40)
[\]^_`              (ASCII码:0x5B~0x60)
{|}~                (ASCII码:0x7B~0x7E)

 本题代码较长,但是逻辑很简单,就是将每一种规则都分成方法写出密码长度、字母、数字、符号以及奖励。然后在主方法中判断属于哪个等级即可。

public class Main {
     public static int length(String s){
        if(s.length()<5){
            return 5;
        }else if(s.length()<8){
            return 10;
        }else{
            return 25;
        }
    }
    public static int letters(String s){
        int c1 = 0;
        int c2 = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c<='Z'&&c>='A'){
                c1++;
            }else if(c<='z'&&c>='a'){
                c2++;
            }
        }
        if(c1==0&&c2==0){
            return 0;
        }else if(c1!=0&&c2!=0){
            return 20;
        }else{
            return 10;
        }
    }
    public static int numbers(String s){
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c>='0'&&c<='9'){
                count++;
            }
        }
        if(count==0){
            return 0;
        }else if(count==1){
            return 10;
        }else{
            return 20;
        }
    }
    public static int symbols(String s){
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c>=0x21&&c<=0x2F||c<=0x40&&c>=0x3A||c<=0x60&&c>=0x5B||c<=0x7E&&c>=0x7B){
                count++;
            }
        }
        if(count==0){
            return 0;
        }else if(count==1){
            return 10;
        }else{
            return 25;
        }
    }
    public static int rewards(String s){
        int letters = letters(s);
        int numbers = numbers(s);
        int symbols = symbols(s);
        if(letters>0&&numbers>0&&symbols==0){
            return 2;
        }else if(letters==10&&numbers>0&&symbols>0){
            return 3;
        }else if(letters==20&&numbers>0&&symbols>0){
            return 5;
        }else return 0;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int letters = letters(s);
        int numbers = numbers(s);
        int symbols = symbols(s);
        int length = length(s);
        int rewards = rewards(s);
        int count = letters+numbers+symbols+length+rewards;
        if(count>=90){
            System.out.println("VERY_SECURE");
        } else if (count>=80) {
            System.out.println("SECURE");
        } else if (count>=70) {
            System.out.println("VERY_STRONG");
        } else if (count>=60) {
            System.out.println("STRONG");
        } else if (count>=50) {
            System.out.println("AVERAGE");
        } else if (count>=25) {
            System.out.println("WEAK");
        }else {
            System.out.println("VERY_WEAK");
        }
    }
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世界级白日梦冠军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值