1.用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时©
A.仅修改队头指针
B.仅修改队尾指针
C.队头、队尾指针都可能要修改
D.队头、队尾指针都要修改
2.递归函数最终会结束,那么这个函数一定?(B)
A.使用了局部变量
B.有一个分支不调用自身
C.使用了全局变量或者使用了一个或多个参数
D.没有循环调用
解析:
直接排除AD,注意力集中在B和C。 B肯定是对的,只有一次循环满足某个条件,不调用自己就返回,递归才会一层一层向上返回。 那么C呢,全局变量和参数确实可以用来控制递归的结束与否。 该不该选C呢?再仔细看一下题目(说实话,我很讨厌这种文字游戏),“这个函数一定…“,所以,问题集中在,是否是一定会使用这两种方式呢? 显然不是的。 除了C中提到的两种情况外,还有如下控制递归的方式: 1.局部静态变量是可以控制递归函数最终结束的 2.可能通过异常来控制递归的结束。 3.可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的终止。 4.可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。 所以,答案为B
3.标题:子串判断
现有一个小写英文字母组成的字符串s和一个包含较短小写英文字符串的数组p,请设计
一个高效算法,对于p中的每一个较短字符串,判断其是否为s的子串。给定一个string数组p和它的大小n,同时给定string s,为母串,请返回一个bool数组,每个元素代表p中的对应字符串是否为s的子串。保证p中的串长度小于等于8,且p中的串的个数小于等于500,同时保证s的长度小于等于1000。
测试样例:
[“a”,“b”,“c”,“d”],4,“abc”
返回:[true,true,true,false]
import java.util.*;
public class Substr {
public boolean[] chkSubStr(String[] p, int n, String s) {
// write code here
int index = 0;
boolean[] result = new boolean[n];
List<String> list = new ArrayList<>();
while(index<s.length()){
for(int i = index+1;i<=s.length();i++){
String m = s.substring(index,i);
list.add(m);
}
index++;
}
for(int i = 0;i<n;i++){
if(list.contains(p[i])){
result[i]=true;
}else{
result[i]=false;
}
}
return result;
}
}
//方法二:
import java.util.*;
public class Main{
public boolean[] chkSubStr(String[] p, int n, String s) {
// 创建boolean数组
boolean[]hasSub=new boolean[p.length];
//遍历数组 使用集合中特有功能
for (int i = 0; i < p.length; i++) {
hasSub[i]=s.contains(p[i]);
}
return hasSub;
}
}
4.标题:成绩排序
查找和排序题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
Tom 70
jack 70
peter 96
输入描述:
输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1:
输入
3
0
fang 90
yang 50
ning 70
输出
fang 90
ning 70
yang 50
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int number = sc.nextInt();
int flag = sc.nextInt();
List<Integer> list = new ArrayList<>();
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < number; i++) {
String name = sc.next();
int score = sc.nextInt();
list.add(score);
map.put(name + " " + score, score);
}
Collections.sort(list);
if (flag == 0){
Collections.reverse(list);
}
int pre = -1;
for (int i : list) {
if (pre == i)
continue;
for (String key : map.keySet())
if (map.get(key).equals(i))
System.out.println(key);
pre = i;
}
}
}
}
//方法二:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
//输入人数
int numPeople = scanner.nextInt();
//排序策略
int option = scanner.nextInt();
//输入人员的姓名和成绩
List<Student> stuList = new ArrayList<>();
for (int i = 0; i < numPeople; i++) {
stuList.add(new Student(scanner.next(), scanner.nextInt()));
}
//降序
if (option == 0) {
stuList.sort((o1, o2) -> o2.score - o1.score);
} else if (option == 1)
//升序
{
stuList.sort((o1, o2) -> o1.score - o2.score);
}
for (Student student : stuList) {
System.out.println(student.name + " " + student.score);
}
}
}
}
class Student {
public String name;
public int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
}