一、选择题
1、以下JAVA程序的运行结果是什么 (D )
public static void main(String[] args) {
Double o1 = true ? new Integer(1) : new Double(2.0);
Object o2;
if(true){
o2 = new Integer(1);
}else{
o2 = new Double(2.0);
}
System.out.print(o1);
System.out.print(" ");
System.out.print(o2);
}
A: 1 1
B: 1.0 1.0
C: 1 1.0
D: 1.0 1
答案解析:D
Double o1 = true ? new Integer(1) : new Double(2.0);三目运算符:result = ? : ;expression 是一个布尔表达式。当expression 为真时,执行 statement1, 否则就执行 statement3。
o1为Double类型,所以o1=1.0;
o2走的时候if这条分支为Integer类型,结果为1
2、以下JAVA程序代码的输出是,定义如下程序:(B )
public static void main(String args[]) {
System.out.println(14^3);
}
A: 2744
B: 13
C: 17
D: 11
答案解析:B
14的二进制表示为:1110 3的二进制表示是:11 ^为异或,同一位数据相同记过为0,不同结果为1
1110^11结果为1101
3、已知 boolean result = false,则下面哪个选项是合法的:【多选】(B,D )
A: result=1
B: result=true
C: if(result!=0) {//so something…}
D: if(result) {//do something…}
答案解析:B D
result是boolean类型的,赋值只有true 或者false;result不能和0放在一起判断,两者的类型不同
4、以下那些代码段能正确执行: 【多选】( C,D)
A:
public static void main(String args[]) {
byte a = 3;
byte b = 2;
b = a + b;
System.out.println(b);
}
B:
public static void main(String args[]) {
byte a = 127;
byte b = 126;
b = a + b;
System.out.println(b);
}
C:
public static void main(String args[]) {
byte a = 3;
byte b = 2;
a+=b;
System.out.println(b);
}
D:
public static void main(String args[]) {
byte a = 127;
byte b = 127;
a+=b;
System.out.println(b);
}
答案解析:C D
A选项中,两个byte类型的数据相加在运算时会自动提升表达式的类型至 int 型,不能再赋值给byte类型了;B选项也是一样的道理;
所以A B错误;+= 除了实现 + 功能外,还会根据接收变量的类型自动进行类型的强制转换。
5、以下表达式的类型和值是什么?(注意整数除法)( D)
-5 + 1/4 + 2*-3 + 5.0
A: int -3
B: int -4
C: double -5.5
D: double -6.0
答案解析:D
乘* 和 除/ 的优先级高于加减,1/4结果为0,因为两个数据类型为int的数据相除,结果为int,0.25取整为0;
所以表达式变为-5 + 0 +(-6)+5.0
又因为Java默认最后结果往精确度更高的地方靠拢,因为5.0为double类型,所以最后会生成一个double
结果为-6.0
二、编程题
1、移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。OJ链接【力扣-27号问题】
示例1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例
如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不
需要考虑数组中超出新长度后面的元素。
【解题思路】:
由于题目要求删除数组中等于 val 的元素,因此输出数组的长度一定小于等于输入数组的长度,我们可以把输出的数组直接写在输入数组上。可以使用双指针:右指针right 指向当前将要处理的元素,左指针 left 指向下一个将要赋值的位置。
如果右指针指向的元素不等于val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。
class Solution {
public int removeElement(int[] nums, int val) {
if(nums==null||nums.length==0){
return 0;
}
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=val){
nums[j]=nums[i];
j++;
}
}
return j;
}
}
2、罗马数字转整数
罗马数字包含以下七种字符: I , V , X , L , C , D 和 M 。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 给定一个罗马数字,将其转换成整数。
OJ链接【力扣-13号问题】
示例1:
输入: s = "III"
输出: 3
示例2:
输入: s = "IV"
输出: 4
示例3:
输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3
示例4:
输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
解题思路:
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
例如 XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
例如 XIV 可视作X−I+V=10−1+5=14。
class Solution {
public int romanToInt(String s) {
// 1. 添加剩余6种对照情形
s = s.replace("IV","a");
s = s.replace("IX","b");
s = s.replace("XL","c");
s = s.replace("XC","d");
s = s.replace("CD","e");
s = s.replace("CM","f");
// 2. 统计罗马字符和
int res = 0;
for (int i = 0; i < s.length(); i++) {
res += getValue(s.charAt(i));
}
return res;
}
// 3. 对照表
public int getValue(char c) {
switch(c) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
}
return 0;
}
}