一、选择题
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/5;
System.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;
}
}