Java训练题3

一、选择题

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;
    }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值