牛客网day24

一.选择题

1.假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?( )

class A{

static int i;

String s;

static void method1() { }

void method2() { }

}
System.out.println(a.i);
a.method1();
A.method1();
A.method2()
2.对于一个已经不被任何变量引用的对象,当垃圾回收器准备回收该对象所占用的内存时,将自动调用该对象的哪个方法()
finalize
notify
notifyAll
hashCode
3.在( )情况下适宜采用内联函数。
函数代码小,频繁调用
函数代码多,频繁调用
函数体含有递归语句
函数体含有循环语句
4.对于Java中异常的描述正确的是( )
用throws定义了方法可能抛出的异常,那么调用此方法时一定会抛出此异常。
如果try块中没有抛出异常,finally块中的语句将不会被执行。
抛出异常意味着程序发生运行时错误,需要调试修改 / /编译时异常不是运行时抛出
Java中的可不检测(unchecked)异常可能来自RuntimeException类或其子类。
5.下列关于计算机系统和Java编程语言的说法,正确的是()
计算机是由硬件、操作系统和软件组成,操作系统是缺一不可的组成部分。
Java语言编写的程序源代码可以不需要编译直接在硬件上运行。
在程序中书写注释不会影响程序的执行,可以在必要的地方多写一些注释。
Java的集成开发环境(IDE),如Eclipse,是开发Java语言必需的软件工具。
6.结构型模式中最体现扩展性的模式是()
装饰模式
合成模式
桥接模式
适配器
解析:结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例。故可以分为类结构模式和对象结构模式。
在GoF设计模式中,结构型模式有:
1.适配器模式 Adapter
适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
两个成熟的类需要通信,但是接口不同,由于开闭原则,我们不能去修改这两个类的接口,所以就需要一个适配器来完成衔接过程。
2.桥接模式 Bridge
桥接模式将抽象部分与它的实现部分分离,是它们都可以独立地变化。它很好的支持了开闭原则和组合锯和复用原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这些多角度分离出来让他们独立变化,减少他们之间的耦合。
3.组合模式 Composite
组合模式将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
4.装饰模式 Decorator
装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。 装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。
5.外观模式 Facade
外观模式为子系统中的一组接口提供了同意的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式中,客户对各个具体的子系统是不了解的,所以对这些子系统进行了封装,对外只提供了用户所明白的单一而简单的接口,用户直接使用这个接口就可以完成操作,而不用去理睬具体的过程,而且子系统的变化不会影响到用户,这样就做到了信息隐蔽。
6.享元模式 Flyweight
享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。.
享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。
7.代理模式 Proxy
为其他对象提供一种代理,并由代理对象控制对原对象的引用,以间接控制对原对象的访问。

7.下面有关java object默认的基本方法,说法错误的是?
equals(Object obj) 指示某个其他对象是否与此对象“相等”
copy() 创建并返回此对象的一个副本
wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
toString() 返回该对象的字符串表示
8.What will happen when you attempt to compile and run the following code?
public class Test{
static{
int x=5;
}
static int x,y;
public static void main(String args[]){
x–;
myMethod( );
System.out.println(x+y+ ++x);
}
public static void myMethod( ){
y=x++ + ++x;
}
}
compiletime error
prints:1
prints:2
prints:3
prints:7
prints:8
9.下面有关java类加载器,说法正确的是?
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用

10.局部内部类可以用哪些修饰符修饰?
public
private
abstract
final

二.编程题

题目描述
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index.
输入描述:
输入一个待编码的字符串,字符串长度小于等于100.
输出描述:
输出这个编码的index
示例1
输入
复制
baca
输出
复制
163311
https://www.nowcoder.com/practice/6fc8716ee33e4cc59d58d7e18712094e?tpId=85&&tqId=29870&rp=3&ru=/activity/oj&qru=/ta/2017test/question-ranking
解析:题目还是有依据的:
五笔的编码范围是a到y的25个字母,从1位到4位的编码,
如果将五笔的编码按字典序排序,形成数组如下:a, aa, aaa, aaaa, aaab, aaac, …, b, ba, baa, baaa, baab…yyyx, yyyy
不过还是有些难懂,这个字典序
首先可以分成25个大块,每块是以字母a-y开头(不是x是叉,代表空,不满四个字符)
第一大块包含多少个呢?如果长度是4,说明都不包含空(x)第一位已经确定,就是a还有三位可选(选25个字母之一),就是252525,长度是3说明有一个空,2525,长度为2,两个空只剩一个位置可以是25个字母中任意一个,25,长度是1,那就只有a自己了。所以一共是 253+252+25+1
在这里插入图片描述
例:bcd
第一位是b所以处在第二大块,result += 1 * (253+252+25+1)
第二位是c, result += 2 (25^2+25+1)+1
第三位是d, result += 3
(25+1)+1 (加一是因为最前面有个空)
第四位是空,不管,因为空就是第一个
result = 17658
例:defc
第一位是d所以处在第四大块,result += 3 * (253+252+25+1)
第二位是e, result += 4 (25^2+25+1)+1
第三位是 f, result += 5
(25+1)+1
第四位是c, result += 2
(1)+1
result = 51567

import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		System.out.println( letterCode(str));
		sc.close();
	}
	public static int letterCode(String code){
		/**
		 * index 用来表示25的幂初始值为3
		 * codenumber计算编码的和
		 * number记录回溯次数最大值为字符串长度-1
		 * 
		 */
		int index=3,codenumber=0,number=0;
		/**
		 * 整个循环用来计算编码
		 * 每回溯一次之前计算结果为第number位的所有排列并把结果给codenumber
		 * 当回溯时给number位的计算结果加一因为上一位有可能为空但是第一位不存在空的情况
		 */
		for(int i=0;i<4;i++){
			    if(number<=code.length()-1){
				codenumber+=findletter(code.charAt(number))*Math.pow(25, index);//计算一位上的可能情况
			    }
				//System.out.println(number);
				index--;
			if(i==3){//如果循环到了第三次给每一位上的所有可能值的结果加1*字母的次序
				if(number>0&&number<=code.length()-1){//每次回溯之前给除第一位外的每一位计算结果加1
					codenumber++;
					}
				number++;//回溯次数加一
				i=number-1;//回溯几次i的开始值为回溯次数减一因为for在之后会加一
				index=3-number;//没回溯一次index的最大值为当前i+1到字符串长度的长度
				//System.out.println(codenumber);
			}
		}
		return codenumber;
	}
	//确定字母次序,看它属于哪个块
	public static int findletter(char code){
		char[] letter={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y'};
		for(int j=0;j<letter.length;j++){
			if(code==letter[j]){
				return j;
			}
		}
		return 0;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值