赊了一串冰糖葫芦才写出来的小结

一、前言

关于这个板块我主要用来记述一些日常练习的选择题、编程题进行查缺补漏 ~(部分题没有学过就会被特殊标记一下的哦)

二、选择题

(未学)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;
	}
}

以上的代码都基于快速排序的递归实现~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值