zl程序教程

您现在的位置是:首页 >  其它

当前栏目

【nowcoder】笔试强训Day9

笔试 nowcoder
2023-09-11 14:17:51 时间

目录

一、选择题

二、编程题

2.1另类加法

2.2走方格的方案数


一、选择题

1.下面程序的输出是:()

String x="fmn";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.out.println(y);

A FmNwxy

B fmnwxy

C wxyfmn

D Fmnwxy

String x = “fmm”;“fmn”是在常量的不可变对象。x.toUpperCase()将字符串全部变成大写,在堆中new一个“FMN”对象,但无任何引用指向它。

所以x仍然是 "fmn",y=x.replace('f','F'),意味着将x中的f换成F,所以y ="Fmn" 然后y=y+"wxy",所以y = "Fmnwxy"。

所以正确答案是 

2.在 java 中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为()

A 隐藏

B 覆盖

C 重载

D 无此特性

一个类可同时定义为许多同名的方法,这些方法的形式参数个数,类型或顺序各不相同,传回的值可能各不相同,这种面向对象的特性称为重载。

所以正确答案是 C  

3.关于 JAVA 堆,下面说法错误的是()

A 所有类的实例和数组都是在堆上分配内存的

B 对象所占的堆内存是由自动内存管理系统回收

C 堆内存由存活和死亡的对象,空闲碎片区组成

D 数组是分配在栈中的

所有类的实例和数组都是在堆上分配内存的,对象所占的堆内存是由自动内存管理系统回收,堆内存由存活和死亡的对象,空闲碎片区组成。数组的引用存在栈内存中,而数组对象保存在堆里面。

所以正确答案是 

4.一个以“.java”为后缀的源文件

A 只能包含一个public类,类名必须与文件名相同

B 只能包含与文件名相同的public类以及其中的内部类

C 只能有一个与文件名相同的public类,可以包含其他非public类(不考虑内部类)

D 可以包含任意public类

一个以“.java”为后缀的源文件只能有一个与文件名相同的public类,可以包含其他非public类

所以正确答案是 C  

5.JAVA语言的下面几种数组复制方法中,哪个效率最高?

A for循环逐一复制

B System.arraycopy

C Arrays.copyOf

D 使用clone方法

效率:System.arraycopy > clone > Arrays.copyOf >  for循环逐一复制

所以正确答案是 B  

6.()仅包含方法定义和常量值。

A 接口

B 变量

C 单元

D 成员

接口仅包含方法定义和常量值,方法不包含大括号,不能进行详细描述,需要有子类进行拓展。

所以正确答案是 A  

7.对文件名为Test.java的java代码描述正确的是()

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
}
class Employee extends Person {
    String empID = "0000";
    public Employee(String id) {
        empID = id;
    }
}
public class Test {
    public static void main(String args[]) {
        Employee e = new Employee("123");
        System.out.println(e.empID);
    }
}

A 输出:0000

B 输出:123

C 编译报错

D 输出:No name 

在子类和父类如果都有有参构造,那么必须在子类中调用父类的有参构造给他初始化,否则会编译报错。

所以正确答案是 C  

8.有关下述Java代码描述正确的选项是____。

public class TestClass {
    private static void testMethod(){
        System.out.println("testMethod");
    }
    public static void main(String[] args) {
        ((TestClass)null).testMethod();
    }
}

A 编译不通过

B 编译通过,运行异常,报NullPointerException

C 编译通过,运行异常,报IllegalArgumentException

D 编译通过,运行异常,报NoSuchMethodException

E 编译通过,运行异常,报Exception

F 运行正常,输出testMethod

本题是可以正常运行的,如果将static去掉就会有空指针异常,static表示静态,直接用类名就能调用方法。

所以正确答案是 F  

9.下列java程序的输出结果为____。

public class Example{
    String str=new String("hello");
    char[]ch={'a','b'};
    public static void main(String args[]){
        Example ex=new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[]){
        str="test ok";
        ch[0]='c';
    }
}

A hello and ab

B hello and cb

C hello and a

D test ok and ab

E test ok and cb

F test ok and c

change方法中改变了str形参的值,并没有改变主方法中str引用的对象,而第二行直接改变了ch数组引用对象,所以会对主方法中的ch数组也造成改变。

所以正确答案是 B  

10.下列 java 程序输出结果为______。

int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

A true,false

B true,true

C false,true

D false,false

E 对于不同的环境结果不同

F 程序无法执行

“==”进行的是两个变量数值的比较,对于基本数据类型来说比较的就是基本数值是否相等,对于引用数据类型来说比较的是两个引用是否指向同一个对象(即地址是否相同)。

equals方法进行的是两个类对象的属性值比较,若类的对象需要具体比较属性值是否相等需要复写Object类中提供的equals方法。
基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱,然后与基本数据类型进行值的比较所以i==j返回的是true。

引用数据类型与基本数据类型进行比较,基本数据类型会进行自动装箱,与引用数据类型进行比较,Object中的equals方法比较的是地址,但是Integer类已经重写了equals方法,只要两个对象的值相同,则可视为同一对象,具体看API文档,所以这归根到底也是值的比较。所以j.equals(i)返回的是true。

此题考察了所以正确答案是 B  

二、编程题

2.1另类加法

给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符

 本题需要返回A+B的值并且不能使用算术运算符,首先排除特殊情况如果B为0的话,那么结果就是A,然后进入循环,int sum = A^B; 使A和B(按位异或^两个二进制位相同返回0,不相同返回1)得到sum,然后使A和B按位与&(如果两个二进制位都为1,则返回1,否则返回0)然后将结果左移位<<得到tmp,然后将sum值赋给A,将tmp值赋给B。直到B<=0。

import java.util.*;
public class UnusualAdd {
    public int addAB(int A, int B) {
        if(B==0){
            return A;
        }
        while(B!=0){
            int sum = A^B;
            int tmp = (A&B)<<1;
            A = sum;
            B = tmp;
        }
        return A;
    }
}

2.2走方格的方案数

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。 注:沿棋盘格之间的边缘线行走 数据范围: 1≤n,m≤8

 在本题中一共有四种可能性。

第一种情况是n = 1,m = 1,只有一个小方块,那么只有m+n = 2 两种走法。

 第二种情况是m = 1

第三种情况是n = 1,第二种情况和第三种情况都是有m+n种走法。

 第四种情况就是m和n都不是1,那么这种时候就需要进入递归,返回g(n,m-1)+g(n-1,m),将整个方块拆分为两块进行运算。直到上述三种情况才结束递归。

import java.util.Scanner;
public class Main {
        public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        System.out.println(g(n,m));
    }
    public static int g(int n,int m){
        if(m==1&&n==1){
            return m+n;
        }
        if(m==1||n==1){
            return m+n;
        }
        return g(n,m-1)+g(n-1,m);
    }
}