一、前言
关于这个板块我主要用来记述一些日常练习的选择题、编程题进行查缺补漏 ~(部分题没有学过就会被特殊标记一下的哦)
二、选择题
(未学)1.执行如下程序,输出结果是( )
class Test{
private int data;
int result = 0;
public void m(){
result += 2;
data += 2;
System.out.print(result + " " + data);
}
}
class ThreadExample extends Thread{
private Test mv;
public ThreadExample(Test mv){
this.mv = mv;
}
public void run(){
synchronized(mv){
mv.m();
}
}
}
class ThreadTest{
public static void main(String args[]){
Test mv = new Test();
Thread t1 = new ThreadExample(mv);
Thread t2 = new ThreadExample(mv);
Thread t3 = new ThreadExample(mv);
t1.start();
t2.start();
t3.start();
}
}
正确答案 : 2 24 46 6
做题时有关于对synchronized(mv)以及data和result的结果是在上一个进程执行的基础上递增的 , 以下就是关于这个题的解析 :
① 这里创建线程的方法是通过显式继承Thread类的方式来实现
② synchronized(mv) 对象锁 ,(实例锁) , 当多个并发线程访问同步synchronized(this)同步代码块时 , 某一时刻仅能有一个线程能执行同步,其他线程必须等待
③ 线程1 , 2 , 3 不管谁先run , 都是调用了mv对象的m方法,三个线程谁先run的结果都一样 , data 和 result没有被static修饰,也就是说 data 和 result 是属于对象的,不同的对象各自拥有一份data和result , 题中三个线程,传入同一个Test对象,也就是同一份 data 和 result.
(未学)2.要使对象具有序列化能力,则其类应该实现如下哪个接口()
A java.io.Serializable
B java.lang.Cloneable,
C java.lang.CharSequence
D java.lang.Comparable
正确答案:A
关于这道选择问题我只了解Cloneable和Comparable这两个接口接口 , 在做这道题的过程中存有一部分侥幸心理 , 单从字面上觉得C选项与字符序列有关就排除掉了,具体的正确解析如下 :
① java.io.Serializable接口是一个标志性接口,在接口内部没有定义任何属性与方法。只是用于标志此接口的实现类可以被序列化与反序列化
② java.lang.Cloneable接口是一个标志性接口,在接口内部没有定义任何属性与方法。如果一个类实现了cloneable接口代表这个类可以被clone , 实现这个接口重写object的克隆方法
③ java.lang.CharSequence接口对许多不同种类的char序列提供统一的只读访问接口。CharSequence是char值的一个可读序列
④ java.lang.Comparable接口,此接口强制对实现它的每个类的对象进行整体排序,重写CompareTo方法来自定义比较的细节
3.下列选项中属于面向对象设计方法主要特征的是( )
A 继承
B 自顶向下
C 模块化
D 逐步求精
正确答案:A
解析 : 面向对象的主要特征:封装,继承,多态
4.关于下列程序段的输出结果,说法正确的是:( )
public class MyClass{
static int i;
public static void main(String argv[]){
System.out.println(i);
}
}
正确答案:0
解析 : 局部变量没有默认初始化值,必须先赋值后使用,否则通不过编译;成员变量(类的属性)有默认初始化值,在创建对象时被初始化static修饰属性就成为了类变量,在类加载时被创建,并进行初始化
5.下列代码的执行结果是:( )
public class Test3{
public static void main(String args[]){
System.out.println(100%3);
System.out.println(100%3.0);
}
}
正确答案:1和1.0
解析 : 第一个100%3取余为1,第二个100%1.0自动向上转换为高精度double类型,所以是1.0
小的数据类型会自动转为大数据类型,无无需强转。
大的数据类型转为小的数据类型,必须强转,但是可能会丢失内容
6.在基本 JAVA 类型中,如果不明确指定,整数型的默认是 __ 类型,带小数的默认是 __ 类型? ( )
正确答案:int double
(存疑)7.方法通常存储在进程中的哪一区()
正确答案:方法区
8.不考虑反射,关于私有访问控制符 private 修饰的成员变量,以下说法正确的是()
A 可以三种类所引用:该类自身、与它在同一包中的其他类,在其他包中的该类的子类
B 可以被两种类访问和引用:该类本身、该类的所有子类
C 只能被该类自身所访问和修改
D 只能被同一个包中的类访问
正确答案 : C
A 是protected的作用
B 无匹配的访问修饰限定符
C 是private
D 是默认访问修饰限定符
9.Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( )
正确答案:12 -11
解析 : Math.round()是先加0.5,然后再向下取整。所以第二空就是-11
10.假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
public class A{
public int i;
static String s;
void method1(){}
static void method2(){}
}
A System.out.println(a.i);
B a.method1();
C A.method1();
D A.method2();
正确答案 : C
解析 : 静态成员和静态方法, 可以直接通过类名进行调用;(也可以通过对象进行调用,可以编译但不建议)
普通成员和方法则需要进行实例化成对象之后, 通过对象来调用
三、编程题
1.标题:统计回文 | 时间限制:1秒 | 内存限制:32768K
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
- 在A的第一个字母之前: “baba” 不是回文
- 在第一个字母‘a’之后: “abba” 是回文
- 在字母‘b’之后: “abba” 是回文
- 在第二个字母’a’之后 “abab” 不是回文
所以满足条件的答案为2
输入描述:
每组输入数据共两行。
第一行为字符串A
第二行为字符串B
字符串长度均小于100且只包含小写字母
输出描述:
输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
示例1:
输入
aba
b
输出
2
import java.util.Scanner;
public class Main {
public static boolean isPalindrome(String s){
int i=0;
int j=s.length()-1;
while(i<j){
//从前到后进行判断
//i<j如果是奇数i,j会边相等,所以要注意循环的条件
if(s.charAt(i)!=s.charAt(j)){
return false;
}
i++;
j--;
}
return true;
}
public static void main(String[] args) {
//循环输入字符串的固定套路
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
//输入字符串A,B
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
//统计回文串出现的次数
int count=0;
//假设长度为3,可以插入的位置有4个位置 <=要用对
for(int i=0;i<=str1.length();i++){
//由于字符串是不可变对象,我们需要用StringBuilder来进行插入操作
StringBuilder sb=new StringBuilder(str1);
sb.insert(i,str2);
//调用自己设计的回文函数来判断
if(isPalindrome(sb.toString())){
count++;
}
}
System.out.println(count);
}
}
}
2.标题:寻找第K大 | 时间限制:3秒 | 内存限制:32768K | 语言限制:[Python, C++, C#, Java]
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
测试样例:[1,3,5,2,2],5,3
返回:2
import java.util.*;
public class Finder {
public int findKth(int[] a, int n, int K) {
// write code here
return quickSort(a,0,n-1,K);
}
private int quickSort(int[] arr,int low,int high,int K){
int p=partion(arr,low,high);
if(K==p-low+1){
return arr[p];
}else if(p-low+1>K){
return quickSort(arr,low,p-1,K);
}else{
return quickSort(arr,p+1,high,K-(p-low+1));
}
}
private int partion(int[] arr,int low,int high){
int temp=arr[low];
while(low<high){
while(low<high&&arr[high]<=temp){
high--;
}
if(low==high){
break;
}else{
arr[low]=arr[high];
}
while(low<high&&arr[low]>=temp){
low++;
}
if(low==high){
break;
}else{
arr[high]=arr[low];
}
}
arr[low]=temp;
return low;
}
}
以上的代码都基于快速排序的递归实现~