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;
}
}