【Java笔试强训 2】
🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!欢迎志同道合的朋友一起加油喔🤺🤺🤺
目录
一、选择题
二、编程题
🔥排序子序列
🔥倒置字符串
一、选择题
1、A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明:
A a0=new A();
A a1=new B();
A a2=new C();
问以下哪个说法是正确的?()
A 只有第一行能通过编译
B 第1、2行能通过编译,但第3行编译出错
C 第1、2、3行能通过编译,但第2、3行运行时出错
D 第1行,第2行和第3行的声明都是正确的
正确答案: D
参考答案:都可以示例化子类的对象
class A{
}
class B extends A{
}
class C extends B{
}
public class Main{
public static void main(String[] args){
A a1=new A();
A a2=new B();
A a3=new C();
}
}
2、下面代码将输出什么内容:()
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
}
A true
B false
C 1
D 编译错误
正确答案: B
参考答案:
本题考查==的含义,对于两个引用变量,只有他们指向同一个引用时,==才会返true。题目中"admin"指向堆内存字符串常量池里admin的地址,而String类的方法都是通过创建新的对象也就是new String()的方式返回的,因此userId.toLowerCase()指向的是这个字符串对象在堆内存中的地址。如果题目中isAdmin方法返回值更改为return userId.toLowerCase().equals("admin");,输出结果将变为true。
3、阅读如下代码。 请问,对语句行 test.hello(). 描述正确的有()
package NowCoder;
class Test {
public static void hello() {
System.out.println("hello");
}
}
public class MyApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test=null;
test.hello();
}
}
A 能编译通过,并正确运行
B 因为使用了未初始化的变量,所以不能编译通过
C 以错误的方式访问了静态方法
D 能编译通过,但因变量为null,不能正常运行
正确答案: A
参考答案:
Test test=null;会出现空指针异常,但是hello方法是一个静态的方法,静态方法的调用不依赖于任何对象,所以能正常运行。
4、在使用super和this关键字时,以下描述正确的是()
A 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B super()和this()不一定要放在构造方法内第一行
C this()和super()可以同时出现在一个构造函数中
D this()和super()可以在static环境中使用,包括static方法和static语句块
正确答案: A
参考答案:
静态方法不依赖于对象
5、如下代码的 结果是什么 ?
class Base {
Base() {
System.out.print("Base");
}
}
public class Alpha extends Base {
public static void main( String[] args ) {
new Alpha();
//调用父类无参的构造方法
new Base();
}
}
A Base
B BaseBase
C 编译失败
D 代码运行但没有输出
E 运行时抛出异常
正确答案: B
参考答案:
Alpha 没有提供构造方法,系统会默认提供一个不带参数的构造方法。
6、如下代码的输出结果是什么?
public class Test {
public int aMethod(){
static int i = 0;
i++;
return i;
}
public static void main(String args[]){
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
A 0
B 1
C 2
正确答案: D
参考答案:
static不能定义局部变量,可以定义成员变量;一个变量被static修饰是类变量,只能放在类里面,不能放在方法中。
7、下列哪一种叙述是正确的()
A abstract修饰符可修饰字段、方法和类
B 抽象方法的body部分必须用一对大括号{ }包住
C 声明抽象方法,大括号可有可无
D 声明抽象方法不可写出大括号
正确答案: D
参考答案:
abstract不能修饰字段
8、下列说法正确的有:()
A class中的constructor不可省略
B constructor必须与class同名,但方法不能与class同名
C constructor在一个对象被new 时执行
D 一个class只能定义一个constructor
正确答案: C
参考答案:
constructor构造方法可以重载
9、选项中哪一行代码可以替换 //add code here 而不产生编译错误
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
A public abstract void method(int a);
B consInt=constInt+5;
C public int method();
D public abstract void anotherMethod(){}
正确答案: A
参考答案:
成员变量可以赋值,但是不能进行运算,运算要放在方法里面;
10、在使用 interface 声明一个外部接口时,只可以使用( )修饰符修饰该接口。
A private
B protected
C private protected
D public
正确答案: D
二、编程题
🔥排序子序列
排序子序列_牛客笔试题_牛客网
注意:为了防止在arr[i]>arr[i+1]时数组下标越界,数组大小申请为n+1,由于题目中说给定的都是正数,arr[n]为0,不会影响最终结果
代码如下:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[] arr=new int[n+1];
for(int i=0;i<n;i++){
arr[i]=scanner.nextInt();
}
int i=0;
int count=0;
while(i<n){
//当前遍历到的数比下一个数小,则进入非递减序列
if(arr[i]<arr[i+1]){
while(i<n && arr[i]<arr[i+1]){
i++;
}
//当前的非递减序列遍历完了,需要划分的数+1
count++;
//进入下一个序列
i++;
}else if(arr[i]>arr[i+1]){
//当前遍历到的数比下一个大,进入非递增序列
while(i<n && arr[i]>arr[i+1]){
i++;
}
//当前的非递增序列结束,count++;
count++;
//进入下一个序列
i++;
}else {
//如果当前数和下一个数相等,i就继续向后遍历
i++;
}
}
System.out.println(count);
}
}
🔥倒置字符串
倒置字符串_牛客题霸_牛客网
思路:
- 先将整个字符串逆置
- 再将每个单词分别逆置
代码如下:
import java.util.*;
public class Main{
public static void reverse(char[] str,int l,int r){
while(l<r){
char tmp=str[r];
str[r]=str[l];
str[l]=tmp;
l++;
r--;
}
}
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
String s=scanner.nextLine();
char[] str=s.toCharArray();
reverse(str,0,str.length-1);
int begin=0;
for(int i=0;i<str.length;i++){
if(str[i]==' '){
reverse(str,begin,i-1);
begin=i+1;
}
}
//此处是将最后一个单词进行逆置,因为当i遍历当字符串末尾时,会跳出循环
//这就倒置最后一个字符串没能在for循环中进行逆置
reverse(str,begin,str.length-1);
StringBuilder sb=new StringBuilder();
for(int i=0;i< str.length;i++){
sb.append(str[i]);
}
System.out.println(sb.toString());
}
}