Java训练题2

一、选择题

1、下面哪些选项是正确的【多选】(A,D )
A: >>是算术右移操作符
B: >>是逻辑右移操作符
C: >>>是算术右移操作符
D: >>>是逻辑右移操作符
答案解析:A D

是算术右移操作符;>>>是逻辑右移操作符
<<是算术左移操作符;<<<是逻辑左移操作符
2、定义如下程序:

public static void main(String[] args){
    Double x=1.2; 
    long l = 1.2; 
    float f =  x/l;
    System.out.println(f);
}

程序执行结果是? (D )
A: 1
B: 1f
C: 运行报错
D: 编译报错
答案解析:D
long l = 1.2; 1.2为浮点型,long类型应该变为double;x/l为双精度浮点类型,不能直接赋值给float,可以通过以下方式:
Double.valueOf(x/l).floatValue()
3、有如下代码:请写出程序的输出结果。(B )

public class Test{
    public static void main(String[] args){
        int x = 0;
        int y = 0;
        int k = 0;
        for (int z = 0; z < 5; z++) {
            if ((++x > 2) && (++y > 2) && (k++ > 2)){
                x++;
                ++y;
                k++;
           }
       }
        System.out.println(x + ”” +y + ”” +k);
   }
}

A: 432
B: 531
C: 421
D: 523
答案解析:B
&&具有串联性质,即多个条件时,只要前面的条件为假,就不需要看后面的条件了
第一轮循环后:x:1 y:0 k:0
第二轮循环后:x:2 y:0 k:0
第三轮循环后:x:3 y:1 k:0
第四轮循环后:x:4 y:2 k:0
第五轮循环后:x:5 y:3 k:1;所以最终的输出结果为:531
4、下列语句序列执行后,输出结果是:(B )

public class Ex{
    public static void main(String[]args){
        int a=13;
        a=a/5System.out.println(a);
   }
}

A: 1
B: 2
C: 3
D: 4
答案解析:B
a是int类型,a/5取整为2;所以a最后的值为2
5、以下代码段执行后的输出结果为:(C )

public class Test {
    public static void main(String args[]) {
        int i = -5;
        i =  ++(i++);
        System.out.println(i);
   }
}

A: -7
B: -3
C: 编译错误
D: -5
答案解析:C
++ 符号只能用在变量上,i++只一个表达式,不符合要求规范

二、编程题

1、截断句子
句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。给你一个句子 s和一个整数 k ,请你将 s 截断 ,使截断后的句子仅含 前 k 个单词。返回 截断 s 后得到的句子。OJ链接 【力扣-1816号问题】

输入:s = "Hello how are you Contestant", k = 4
输出:"Hello how are you"
解释:
s 中的单词为 ["Hello", "how" "are", "you", "Contestant"]4 个单词为 ["Hello", "how", "are", "you"]
因此,应当返回 "Hello how are you"

【解题思路】:
由题意可知,除了最后一个单词,每个单词后面都跟随一个空格。因此我们可以通过统计空格与句子结尾的数目来统计单词数 count。当 count=k 时,将当前的下标记录到 end,返回句子 s 在 end 处截断的句子。

class Solution { 
   public String truncateSentence(String s, int k) {
        int n=s.length();
        int end=0;
        int count=0;
        for(int i=0;i<=n;i++){
            if(i==n||s.charAt(i)==' '){
                count++;
                if(count==k){
                    end=i;
                }
            }
        }
        //返回字符串的子字符串
        return s.substring(0,end);
    }
    
}

2、删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。OJ链接 【力扣-26号问题】
【解题思路】:
由于给定的数组nums 是有序的,因此对于任意 i<j,如果 nums[i]=nums[j]则对任意 i≤k≤j,必有nums[i]=nums[k]=nums[j],即相等的元素在数组中的下标一定是连续的。利用数组有序的特点,可以通过双指针的方法删除重复元素。

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        //双指针
        int fast = 1, slow = 1;
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值