一、选择题
1、下面有关JVM内存,说法错误的是?
A 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
B Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
C 方法区用于存储JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程隔离的
D 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
他的回答: C (正确)
正确答案: C
2、下列程序段的输出结果是:( )
public void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b = x > 50 && y > 60 || x > 50 && y < -60 || x < -50 && y > 60 || x < -50 && y < -60;
System.out.println(b);
}
A true
B false
C 1
D 0
他的回答: A (错误)
正确答案: B
参考答案:
首先,返回类型是boolean,因此不存在返回0或1的情况,C、D选项排除。
本题中,出现的与和非都是短路的,与操作时一旦遇到false就停止执行后当前关系式中的后续代码,同理或操作时一旦遇到true也停止执行。因此从左往右来看,x>50为false,y>60不需要判断,此时b=false,短路或不停止,同理继续向下执行,表达式可以等同于b=false||false||false||false。因此结果为false,答案选择B。
3、输入流将数据从文件,标准输入或其他外部输入设备中加载道内存,在 java 中其对应于抽象类()及其子类。
A java.io.InputStream
B java.io.OutputStream
C java.os.InputStream
D java.os.OutputStream
他的回答: A (正确)
正确答案: A
4、以下程序的输出结果是
public class Print{
static boolean out(char c){
System.out.print(c);
return true;
}
public static void main(String[] argv){
int i = 0;
for(out('A');out('B') && (i<2);out('C')){
i++;
out('D');
}
}
}
A ABDCBDCB
B BCDABCD
C 编译错误
D 运行错误
他的回答: A (正确)
正确答案: A
参考答案:
for循环首先执行out(‘A’) 输出A;然后执行out(‘B’)&&(i<2)此时输出B,i=0,判断条件为真,执行for循环的循环体;执行i++,out(‘D’),输出D i=1;其次执行out(‘C’),输出C;然后执行out(‘B’)&&(i<2) 此时输出B,i=1 判断条件为真,执行for循环的循环体;执行i++,out(‘D’),输出D i=2;执行out(‘C’),输出C;然后执行out(‘B’)&&(i<2) 此时输出B,i=2,不满足i<2判断条件为假,跳出循环。
综上所述结果为ABDCBDCB。
5、下面关于程序编译说法正确的是()
A 、 java语言是编译型语言,会把java程序编译成二进制机器指令直接运行。
B、 java编译出来的目标文件与具体操作系统有关。
C、 java在运行时才进行翻译指令。
D 、java编译出来的目标文件,可以运行在任意jvm上。
他的回答: A (错误)
正确答案: C
A是半编译半解释,目标文件class文件是与操作系统无关得,面向JVM得二进制文件。
6、下面那些情况可以终止当前线程的运行?
A 当一个优先级高的线程进入就绪状态时
B 抛出一个异常时
C 当该线程调用sleep()方法时
D 当创建一个新线程时
他的回答: B (正确)
正确答案: B
线程的终止:
a.线程的任务执行完毕(正常终止)
b.线程执行过程中出现异常(异常终止)
7、下面程序的运行结果:()
public static void main(String args[]) {
Thread t=new Thread(){
public void run(){
dianping();
}
};
t.run();
System.out.print("dazhong");
}
static void dianping(){
System.out.print("dianping");
}
A dazhongdianping
B dianpingdazhong
C a和b都有可能
D dianping循环输出,dazhong夹杂在中间
他的回答: C (错误)
正确答案: B
参考答案:
本题中,线程t并没有启动,只是调用了run()方法,程序中运行的线程依然只有一个,那么程序会按照顺序执行,即先运行run(),run()方法调用dianping()方法输出"dianping",程序继续向下执行输出"dazhong"。如果本题中t线程调用start()方法,就会出现C选项的情况。综上所述,正确答案为B。
8、默认类型等价表示是哪一项:
public interface IService {String NAME="default";}
A public String NAME=“default”;
B public static String NAME=“default”;
C public static final String NAME=“default”;
D private String NAME=“default”;
他的回答: A (错误)
正确答案: C
接口中的变量都是全局变量public static final。
9、有以下类定义:
abstract class Animal{
abstract void say();
}
public class Cat extends Animal{
public Cat(){
System.out.printf("I am a cat");
}
public static void main(String[] args) {
Cat cat=new Cat();
}
}
运行后:
A I am a cat
B Animal能编译,Cat不能编译
C Animal不能编译,Cat能编译
D 编译能通过,但是没有输出结果
他的回答: A (错误)
正确答案: B
抽象类的子类必须覆写所有的抽象方法(子类不是抽象类)。
10、类Test1定义如下:
public class Test1{//1
public float aMethod(float a,float b){}//2
//3
}//4
将以下哪种方法插入行3是不合法的。
A public int aMethod(int a,int b){}
B private float aMethod(int a,int b,int c){}
C public float aMethod(float a,float b){}
D public float aMethod(float a,float b,float c){}
他的回答: D (错误)
正确答案: C
二、编程题
【星际密码】
星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码。表的规则是:n对应的值是矩阵X的n次方的左上角,如果这个数不足4位则用0填充,如果大于4位的则只输出最后4位。
|1 1|^n => |Xn …|
|1 0| |… …|
例如n=2时,
|1 1|^2 => |1 1| * |1 1| => |2 1|
|1 0| |1 0| |1 0| |1 1|
即2对应的数是“0002”。
输入描述:
输入有多组数据。
每组数据两行:第一行包含一个整数n (1≤n≤100);第二行包含n个正整数Xi (1≤Xi≤10000)
输出描述:
对应每一组输入,输出一行相应的密码。
示例1:
输入
6
18 15 21 13 25 27
5
1 10 100 1000 10000
输出
418109877711037713937811
00010089410135017501
【题目解析】:
这个题目首先需要明确矩阵是固定的,其次是矩阵相乘的方法
矩阵相乘 |a1 a2| * |c1 c2| = |a1c1 + a2d1 a1c2 + a2d2| |b1 b2| |d1 d2| |b1c1 + b2d1 b1d2 + b2d2|
矩阵是|1 1|^2 = |1 1|*|1 1|=|2 1| |1 0| |1 0| |1 0| |1 1| n的取值:1 2 3 4 5 6 … 左上角值:1 2 3 5 8 13 … 是一个变式的斐波那契
【解题思路】:初始化斐波那契数列,每次获取对应数据,打印最后4位即可。
牛客网ACM模式代码
import java.util.*;
public class Main {
public static void main(String[] args){
int[] num=new int[10001];
num[1]=1;
num[2]=2;
for(int i=3;i<10001;i++){
num[i]=num[i-1]+num[i-2];
num[i]=num[i]%10000;
}
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
StringBuilder sb=new StringBuilder();
int n=sc.nextInt();
for(int i=0;i<n;i++){
int m=sc.nextInt();
sb.append(String.format("%04d",num[m]));
}
System.out.println(sb);
}
}
}
【数根】
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于24 来说,把2 和4 相加得到6,由于6 是一位数,因此6 是24 的数根。
再比如39,把3 和9 加起来得到12,由于12 不是一位数,因此还得把1 和2 加起来,最后得到3,这是一个一位数,因此3 是39 的数根。
现在给你一个正整数,输出它的数根。
输入描述:
输入包含多组数据
每组数据数据包含一个正整数n(1≤n≤10E1000)。
输出描述:
对应每一组数据,输出该正整数的数根
示例1:
输入
24\n39
输出
6\n3
【解题思路】:
- 接收字符串得到各个数字,并且每位求和(为了得到的数字不大于99)
- 循环对大于9的数字进行对10取余和整除操作,将两个结果进行相加得到树根.
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
while(s.length()>1){
int n=0;
for(int i=0;i<s.length();i++){
n+=s.charAt(i)-'0';
}
s=String.valueOf(n);
}
System.out.println(s);
}
}
}