Java经典笔试题—day05
- 🔎选择题
- 🔎编程题
- 🥝统计回文
- 🥝连续子数组最大和
- 🔎结尾
🔎选择题
(1)下面的程序 编译运行后,在屏幕上显示的结果是()
public class Test {
public static void main(String args[]) {
int x, y;
x = 5 >> 2;
y = x >>> 2;
System.out.println(y);
}
}
A. 0
B. 2
C. 5
D. 80
A
x : 5(0101) >> 2 => 1(0001)
y : 1(0001) >>> 2 => 0(0000)
(2)以下代码结果是什么?
public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+"."+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}
A. 代码可以编译运行,输出“AB.AB”
B. 代码可以编译运行,输出“A.A”
C. 代码可以编译运行,输出“AB.B”
D. 代码可以编译运行,输出“A.B”
C
通过 operate() 方法传入 StringBuffer a, StringBuffer b
x.append(y) 对 x 的值进行了修改, 也就意味着 a 的值进行了修改
y=x, 将 x 的地址赋值给 y, 此时 y 指向了 x, 并不会影响 b 的值
(3)在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()
A. this.A(x)
B. this(x)
C. super(x)
D. A(x)
B
(4)下面代码的运行结果是()
public static void main(String[] args){
String s;
System.out.println("s="+s);
}
A. 代码编程成功,并输出”s=”
B. 代码编译成功,并输出”s=null”
C. 由于String s没有初始化,代码不能编译通过。
D. 代码编译成功,但捕获到NullPointException异常
C
此处的 String s 是一个局部变量, 未进行初始化不能编译
如果将 String s 改成全局变量, 则输出 “s=null”
(5)在java7中,下列不能做switch()的参数类型是?
A. int型
B. 枚举类型
C. 字符串
D. 浮点型
D
不能做 switch() 参数的类型包括 1. double 2.float 3. long 4. boolean
能做 switch() 参数的类型包括 1. int 2. char 3.short 4. byte
(6)一个以”.java”为后缀的源文件
A. 只能包含一个类,类名必须与文件名相同
B. 只能包含与文件名相同的类以及其中的内部类
C. 只能有一个与文件名相同的public类,可以包含其他类
D. 可以包含任意类
C
(7)以下代码返回值是什么?
public boolean returnTest() {
try {
return true;
}
catch (Exception e) {
}
finally {
return false;
}
}
A. true
B. false
B
最后一定会去执行 finally, 因此返回值是 false
(8)以下()不是合法的标识符?
A. STRING
B. x3x
C. void
D. deSf
C
Java 的标识符由数字, 字母, 下划线( _ ), 美元符号( $ )或人民币符号( ¥ )组成
要求标识符的首位不能是数字, 且关键字不能作为标识符
(9)下列有关JAVA异常处理的叙述中正确的是()
A. finally是为确保一段代码不管是否捕获异常都会被执行的一段代码
B. throws是用来声明一个成员方法可能抛出的各种非运行异常情况
C. final用于可以声明属性和方法,分别表示属性的不可变及方法的不可继承
D. throw是用来明确地抛出一个异常情况
A, B, D
A. finally 通常用于资源的关闭, 所以 finally 是一段一定会被执行的代码
B. throws 可以用于声明非运行异常, 也可以声明运行异常
C. final 声明属性表示该属性不可变, 声明方法表示该方法不可重写
D. throw 用于明确地抛出一个异常
(10)指出以下程序运行的结果是 ( )
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
//引用类型变量,传递的是地址,属于引用传递。
str="test ok";
ch[0]='g';
}
}
A. good and abc
B. good and gbc
C. test ok and abc
D. test ok and gbc
B
changes() 方法是引用传递
进入 changes() 方法的形参 str 最初指向的是 “good” 的地址
当执行到 str=“test ok” 时, 形参 str 指向的是 “test ok” 的地址
而实参 str 仍然指向的是 “good” 的地址
ch[0] = ‘g’ 是将 ch 所指向地址的值进行了修改, 即 char[] ch = {‘g’, ‘b’, ‘c’}
但 ch 所指向的对象未发生改变
🔎编程题
🥝统计回文
题目描述
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。
现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。
你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。
如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
- 在A的第一个字母之前: “baba” 不是回文
- 在第一个字母‘a’之后: “abba” 是回文
- 在字母‘b’之后: “abba” 是回文
- 在第二个字母’a’之后 “abab” 不是回文
所以满足条件的答案为2
输入描述
每组输入数据共两行。 第一行为字符串A 第二行为字符串B 字符串长度均小于100且只包含小写字母
输出描述
输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
解题思路
枚举
将字符串 B 分别插入到 字符串 A 的(0 ~ n) 上
判断当前拼接的字符串是不是回文串
import java.util.Scanner;
//统计回文
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNextLine()) {
String a = scan.nextLine();
String b = scan.nextLine();
int ret = 0;
//枚举
for (int i = 0; i <= a.length(); i++) {
StringBuilder s = new StringBuilder(a).insert(i,b);
if(isSame(s.toString()))
ret++;
}
System.out.println(ret);
}
}
//判断是否是回文串
private static boolean isSame(String s) {
char[] chs = s.toCharArray();
int left = 0,right = chs.length - 1;
while(left < right) {
if(chs[left++] != chs[right--])
return false;
}
return true;
}
}
📢题目链接
链接: link
🥝连续子数组最大和
题目描述
一个数组有 N 个元素,求连续子数组的最大和。
例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述
输入为两行。
第一行一个整数n(1 <= n <= 100000),表示一共有n个元素
第二行为n个数,即每个元素,每个整数都在32位int范围内。
以空格分隔。
输出描述
所有连续子数组中和最大的值。
解题思路
以 -6, -3, 7, -1, 2为例
设置一个变量为 sum, 初始值为 nums[0], 记录当前连续子数组中和的最大值
设置一个变量为 max, 初始值为 nums[0], 每次比较 max 和 sum 的结果, 记录整体连续子数组中和的最大值
sum = -6, max = -6
下标为1时, sum = -3, max = -3, 当前的连续子数组从下标为1开始, 而不是下标为0开始了
下标为2时, sum = 7, max = 7, 当前的连续子数组从下标为2开始, 而不是下标为1开始了
下标为3时, sum = 6, max = 7, 当前的连续子数组依旧从下标为2开始
下标为4时, sum = 8, max = 8, 当前的连续子数组依旧从下标为2开始
import java.util.Scanner;
//连续子数组最大和
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNextInt()) {
int n = scan.nextInt();//n个元素
int[] nums = new int[n];
for(int i = 0; i < n; i++) nums[i] = scan.nextInt();
getMax(nums, n);
}
}
private static void getMax(int[] nums, int n) {
int max = nums[0], sum = nums[0];
for (int i = 1; i < n; i++) {
sum = Math.max(sum + nums[i], nums[i]);
max = Math.max(sum, max);
}
System.out.println(max);
}
}
📢题目链接
链接: link
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油