【强训】Day10

努力经营当下,直至未来明朗!


普通小孩也要热爱生活!

一、选择

  1. 下列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 静态区、栈区、栈区

  1. 以下声明合法的是()

A default String s
B public final static native int w( )
C abstract double d
D abstract final double hyperbolicCosine( )

  1. 下面代码的输出结果是什么?
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

  1. 有代码片段如下:
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 运行期抛出异常


二、编程

1. 井字棋

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


2. 密码强度等级

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


答案

1. 选择

  1. 注意区分:final是表示是常量不可变的,static才是静态的。

① 栈:局部变量 + 对象引用
② 堆:成员变量 + 对象本身
③ 方法区:静态变量、类对象
注意:即使被final修饰也只是表明是不可变的而已,依旧还是局部变量;static修饰的才是静态变量。

故:选C

  1. ① 访问控制符:public、protected、default、private,如果啥也没写就是default/friendly,但是不能手动写上,写上就报错。
    ② 被native修饰的是本地方法,底层是C++,表明这个方法采用的是JNI技术(Java Native Interface)完成想要的功能,JNI技术上层规范是JNA(Java Native Access),JNI技术其实也是实现了Java语言与其他语言的通信,比如这次就是C++,很多的方法采用的都是native修饰符,比如Object中hashCode()、clone()、notify()、wait()、以及System中的arraycopy()
    ③ 属性的非可访问控制符可以是static和final,没有abstract。abstract修饰的是方法和类。
    ④ 方法的非可访问控制符可以是abstract、static、final,但是abstract不可以和static以及final连用,毕竟abstract是虚拟的动态的,但是static和final都是静态的,不过static和final可以连用,毕竟两个都是静态的。

故:选B

  1. ① 分母为0会抛出异常,所以在执行到 int i = 100/0; 的时候就会捕捉到异常直接往后执行catch语句块,输出1;
    ② 然后再catch中遇到了throw new RuntimeException(); ,无论如何都是会执行finally语句块的,所以就只是执行finally中的代码块,其他代码都不会执行!

故:选D

  1. 本题主要考查的是整型提升

① final修饰的是常量,b6=b4+b5; 可以直接看作是b6=10,其在编译的时候就已经变成b6=10了,不会发生任何错误。
② 而b1和b2是byte类型的,在进行算术运算时会进行整型提升,变为int类型,计算结果是int类型,最后在赋值时类型不匹配,编译失败,需要强制类型转换。

故:选C

  1. this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

2. 编程

  1. 井字棋

1)思路:

① 井字棋是N*N的二维数组,获胜条件是横竖斜任意连成一条直线(N个)。
② 获胜的条件是行全为1 or 列全为1 or 主副对角线全为1,也就是最后和为N.

2)代码:

import java.util.*;

public class Board {
    public boolean checkWon(int[][] board) {
        // write code here
        // 1.首先检查每一行
        int len = board.length;
        int sum = 0;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                sum += board[i][j];
            }
            // 一行结束,判断是否获胜
            if(sum == len) {
                return true;
            }
        }
        
        // 2.然后检查每一列
        sum = 0;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                sum += board[j][i];
            }
            if (sum == len) {
                return true;
            }
        }
        
        // 3.检查主对角线
        sum = 0;
        for (int i = 0; i < len; i++) {
            sum += board[i][i];
        }
        if (sum == len) {
            return true;
        }
        
        // 4. 检查副对角线
        sum = 0;
        for (int i = 0; i < len; i++) {
            sum += board[i][len-i-1];
        }
        if(sum == len) {
            return true;
        }
        
        return false;
    }
}

  1. 密码强度等级

1)思路:

对于每一个维度要进行单独判断(ASCII码值),然后最后将各单项分值相加,对照判断等级。

2)代码:

// 密码强度等级判定
// 维度:长度、字母、数字、符号、奖励
// 单项值相加进行等级判断

import java.util.Scanner;

public class Main {
    // 等级判断
    private static void getRank(int sumScore) {
        if (sumScore >= 90) {
            System.out.println("VERY_SECURE");
        } else if(sumScore >=80) {
            System.out.println("SECURE");
        } else if(sumScore >= 70) {
            System.out.println("VERY_STRONG");
        } else  if(sumScore >= 60) {
            System.out.println("STRONG");
        } else if(sumScore >= 50) {
            System.out.println("AVERAGE");
        } else if(sumScore >= 25) {
            System.out.println("WEAK");
        } else {
            System.out.println("VERY_WEAK");
        }
    }

    // 长度分值
    private static int getLen(String password) {
        if(password.length() <= 4) {
            return 5;
        } else if (password.length()>=5 && password.length()<=7) {
            return 10;
        } else {
            return 25;
        }
    }

    // 字母分值:
    // 看是否为大小写字母,并且要看是否全为大/小,或者是混合
    // 此时就需要统计个数
    private static int getChar(String password) {
        int big = 0;
        int small = 0;
        // 遍历看每一个字符是否为字母:使用ASCII码值
        for (int i = 0; i < password.length(); i++) {
            if(password.charAt(i)>='a'&& password.charAt(i)<='z') {
                small++;
            } else if (password.charAt(i)>='A'&& password.charAt(i)<='Z') {
                big++;
            }
        }
        // 遍历完成后判断,然后进行统分
        if(small>0 && big>0) {
            return 20;
        } else if (small>0 || big>0) {
            return 10;
        } else {
            return 0;
        }
    }

    // 数字分值
    // 方法跟字母判断类似,同样要统计个数
    private static int getNum(String password) {
        int num = 0;
        for (int i = 0; i < password.length(); i++) {
            if(password.charAt(i)>='0' && password.charAt(i)<='9') {
                num++;
            }
        }
        if (num == 0) {
            return 0;
        } else if (num == 1) {
            return 10;
        } else {
            return 20;
        }
    }

    // 符号分值
    // 数字分值类似
    private static int getSymbol(String password) {
        int sym = 0;
        for (int i = 0; i < password.length(); i++) {
            char ch = password.charAt(i);
            if((ch>=33 && ch<=47) || (ch>=58 && ch<=64) ||
                    (ch>=91 && ch<=96) || (ch>=123 && ch<=126)) {
                sym++;
            }
        }
        if(sym == 0) {
            return 0;
        } else if(sym == 1) {
            return 10;
        } else {
            return 25;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String password = in.next();
            // 进行奖励以及总分计算
            int charScore = getChar(password);
            int numScore = getNum(password);
            int symScore = getSymbol(password);
            int sumScore = getLen(password);

            if (symScore==0 && charScore!=0 && numScore!=0) { // 只有字母和数字
                sumScore += charScore + numScore + 2;
            } else if(charScore==20 && symScore!=0 && numScore!=0) { // 大小写字母、数字、符号
                sumScore += charScore + numScore + symScore + 5;
            } else if (charScore==10 && symScore!=0 && numScore!=0) {
                sumScore += charScore + numScore + symScore + 3;
            } else {
                sumScore += charScore + numScore + symScore;
            }

            // 进行等级判断
            getRank(sumScore);
        }
    }
}

111

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

'Dream是普通小孩耶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值