一、选择题
1、关于java中的数组,下面的一些描述,哪些描述是准确的(A C )
A: 数组是一个对象,不同类型的数组具有不同的类
B: 数组长度是可以动态调整的
C: 数组是一个连续的存储结构
D: 一个固定长度的数组可类似这样定义:int array[100]
答案解析:A C
数组的长度在一开始是定义好的,不可以动态调整;D项中数组不能这样定义;
2、若声明一个浮点数数组如下: float average[]=new float[30];假设该数组的内存起始位置为200, average[15]
的内存地址是(C )
A: 214
B: 215
C: 260
D: 256
答案解析:C
一个浮点类型占4个字节,如果其实位置是200,average[15]是数组中第16个元素,故地址为200+15*4
3、下列哪个类的声明是正确的(D )
A: abstract final class HI{}
B: abstract private move{}
C: protected private number{}
D: public abstract class Car{}
答案解析:D
B C中没有class关键字,A中abstract final不能一起修饰一个类
4、与算法的时间复杂度有关的是(A )
A. 问题规模
B. 计算机硬件性能
C. 编译程序质量
D. 程序设计语言
答案解析:A
比如一个算法的时间复杂度为O(n),n是问题的规模;
n越大,算法执行所需要的时间就越多
5、某算法的时间复杂度为O(n^2),表明该算法的(C )
A. 问题规模是n^2
B. 执行时间等于n^2
C. 执行时间与n^2成正比
D. 问题规模与n^2成正比
答案解析:C
算法的时间复杂度中n只是问题的规模,不代表具体的执行时间,具体的执行时间和CPU执行的时间有关
二、编程题
1、拼写单词
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表words 中你掌握
的所有单词的长度之和。OJ链接【力扣-1160号问题】
示例1:
输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
示例2:
输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。
【解题思路】:
这是一类经典的题型。凡是和“变位词”、“字母顺序打乱”相关的题目,都考虑统计字母出现的次数。这种方法我叫做“counter 方法”。我们既统计“字母表”中字母出现的次数,也统计单词中字母出现的次数。如果单词中每种字母出现的次数都小于等于字母表中字母出现的次数,那么这个单词就可以由字母表拼出来。
如何实现计数结构呢?我们注意到题目有一个额外的条件:所有字符串中都仅包含小写英文字母。这意味着我们可以用一个长度为 26 的数组来进行计数。这也是很多字符串计数问题的常用技巧。
class Solution {
public int countCharacters(String[] words, String chars) {
int[] chars_count=count(chars);// 统计字母表的字母出现次数
int res=0;
for(String word:words){
int[] word_count=count(word);// 统计单词的字母出现次数
if(contains(chars_count,word_count)){
res+=word.length();
}
}
return res;
}
// 检查字母表的字母出现次数是否覆盖单词的字母出现次数
boolean contains(int[] chars_count,int[] word_count){
for(int i=0;i<26;i++){
if(chars_count[i]<word_count[i]){
return false;
}
}
return true;
}
// 统计 26 个字母出现的次数
int[] count(String word){
int[] counter=new int[26];
for(int i=0;i<word.length();i++){
char c=word.charAt(i);
counter[c-'a']++;
}
return counter;
}
}
2、一年中的第几天
给你一个按 YYYY-MM-DD 格式表示日期的字符串 date,请你计算并返回该日期是当年的第几天。通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。OJ链接【力扣-1160号问题】
示例1:
输入:date = "2019-01-09"
输出:9
示例2:
输入:date = "2019-02-10"
输出:41
这个问题考察两点:1.闰年的判定 2.使用subString根据字符串的特点拆分出年月日。
class Solution {
public int dayOfYear(String date) {
int year=Integer.parseInt(date.substring(0,4));
int month = Integer.parseInt(date.substring(5,7));
int day = Integer.parseInt(date.substring(8));
int[] monthArray = {31,28,31,30,31,30,31,31,30,31,30,31};
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
monthArray[1] = 29;
}
int sum = 0;
for (int i = 0; i < month - 1; i++) {
sum += monthArray[i];
}
sum += day;
return sum;
}
}