以下題解只是個人的理解,如果發現答案有誤或者有更簡潔方式,望大家及時指出!! 部分題解自己還沒有想到更好的方式去解答,如果有更好的解題方式會及時更新。
試題A :組隊------ 答案 490
這道題沒有必要使用代碼進行解題,本題的坑主要在於一個人只能選擇一次,只要認真審題,就可以解答出來。
試題B :不同子串
public static void main(String[] args) {
String num[] = new String[150];
String str = "0100110001010001";
int k = 0;
for (int i = 0; i <= str.length(); i++) {
for (int j = i + 1; j <= str.length(); j++) {
String s = str.substring(i, j);
int c = 0;
for (int z = 0; z < k; z++) {
if (num[z].equals(s)) {
c = -1;
break;
}
}
if (c == 0) {
num[k] = s;
k++;
}
}
}
System.out.println(k);
}
解題思路:本題主要運用了字符串的subString方法,如果不理解subString方式,請自行查閱API文檔或百度。創建一個num數組,來儲存截取出來的字符串,因爲現在還不知道結果是多少,所以聲明數組長度時,我聲明瞭150個長度。接下來使用subString方法將字符串截取,截取出一個字符串之後放到num中,放入num數組時,進行判斷,如果當前數組已經有了和當前截取出的字符串相等的,則跳過,如果num數組中沒有和當前截取出的字符串相等的,就放入num數組中。最後k的值就是不同子串的個數。注意:這裏需要注意一下,比較字符串是否相等時需要使用a.equals(b)方法,不能使用==進行判斷。因爲String重寫equals()方法。對於字符串的比較時,equals比較的是內容是否相等,而==比較的引用地址。所以,一般在比較字符串時,建議使用equals方法進行比較。當然,如果學了集合的同學,沒有比較這麼麻煩使用數組進行判斷,可以根據set集合的無序不可重複性,當遍歷完成之後,直接獲取set集合的size即可。
試題C:數列求和
public static void main(String[] args) {
int a = 1;
int b = 1;
int c = 1;
int sum = 0;
for (int i = 3; i < 20190324; i++) {
sum = (a + b + c) % 10000;
a = b;
b = c;
c = sum;
}
System.out.println(c);
}
解題思路:這個題的思路比較簡單,有一個坑,不能直接算出20190324的和在對結果取後四位,因爲20190324的結果已經超過了int的最大值,在java中如果對int的最大值2147483647 +1,它會變成-2147483648。所以直接計算會導致計算結果不準確。
試題F:特別數的和
public static void main(String[] args) {
int sum = 0;
Scanner s = new Scanner(System.in);
int n = s.nextInt();
for (int i = 1; i <= n; i++) {
String j = i + "";
if (j.indexOf("0") == -1 && j.indexOf("2") == -1 && j.indexOf("1") == -1 && j.indexOf("9") == -1) {
continue;
}
}
System.out.println(sum);
}
這裏使用了數組的indexOf方法,可以利用這個方法,判斷其中有沒有2019, 如果沒有則會返回-1。
試題G: 外面優先級
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt(); // n家店
int m = s.nextInt(); // m個數據
int t = s.nextInt(); // t時刻
int a[][] = new int[m][2]; // 保存用戶輸入
for (int i = 0; i < m; i++) {
a[i][0] = s.nextInt();
a[i][1] = s.nextInt();
}
int b[] = new int[n]; // 保存優先級 索引爲0 表示第一家店的優先級
int c[] = new int[n]; // 保存優先緩存
int count = 0; // 默認優先緩存爲0
// 接下來就可以判斷,如果當前時刻有訂單 ,則優先級+2,沒有則優先級-1
int k = 1; // k表示當前時間
// 循環a數組,查找當前時間是否有訂單
for (; k <= t; k++) {
for (int i = 0; i < m; i++) {
if (a[i][0] == k) {
// 表示k時刻時 有外賣訂單
for (int j = 0; j < n; j++) { // j+1 表示店
// 當 j+1 等於 a[i][1] 表示當前店有訂單 有訂單+2 沒有訂單-1
if (a[i][1] == j + 1) {
b[j] += 2;
} else {
if (b[j] != 0)
b[j]--;
}
// 當優先級大於5時,加入優先緩存
if (b[j] > 5) {
c[count++] = j + 1; // 保存店名
}
// 當優先級小於等於3 ,刪除緩存
if (b[j] <= 3) {
for (int l = 0; l < n; l++) {
if (c[l] == j + 1) {
c[l] = -1;
count--;
}
}
}
}
}
}
}
System.out.println(count);
}
解題思路:a數組來保存用戶輸入,b數組保存店家的優先級,b[0] 保存了第一家店的優先級,b[1]保存了第二家店的優先級,以此類推。c數組來保存優先級緩存,當滿足條件時,會被添加到c數組中。然後進行判斷就可以了。
試題H:人物相關性
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int k = s.nextInt();
s.nextLine();
String str = s.nextLine();
String a = "Alice";
String a1 = "Alice.";
String b = "Bob";
String b1 = "Bob.";
int count = 0;
int num = 0;
// 按照空格分隔
String str1[] = str.split(" ");
// 尋找Alice -> Bob
for (int i = 0; i < str1.length; i++) {
if (str1[i].equals(a) || str1[i].equals(a1)) {
if (str1[i].equals(a1)) {
num = 1;
}
for (int j = i + 1; j < str1.length; j++) {
num += str1[j].length();
if (str1[j].equals(b) || str1[j].equals(b1)) {
num = num + j - i;
if (str1[j].equals(b1)) {
num = num - 4;
} else {
num = num - 3;
}
if (num > k)
break;
count++;
num = 0;
}
}
}
}
// 尋找Bob -> Alice
for (int i = 0; i < str1.length; i++) {
if (str1[i].equals(b) || str1[i].equals(b1)) {
if (str1[i].equals(b1)) {
num = 1;
}
for (int j = i + 1; j < str1.length; j++) {
num += str1[j].length();
if (str1[j].equals(a) || str1[j].equals(a1)) {
num = num + j - i;
if (str1[j].equals(a1)) {
num = num - 6;
} else {
num = num - 5;
}
if (num > k)
break;
count++;
num = 0;
}
}
}
}
System.out.println(count);
}
解題思路: 首先注意,輸入帶有空格的字符串的時候,只能使用nextLine方法,但是如果nextLine在nextint之後時,會將輸入nextInt的回車當作輸入的值,所以要想在nextInt之後正確的使用nextLine,需要多添加一個nextLine方法。將輸入的字符串按照空格分隔存入一個數組中,這樣每個單詞就成了單獨的元素。接下來開始遍歷尋找Alice或Alice. ,找到後,開始向後尋找Bob或Bob. 如果找到,只需要判斷他們之間的距離是否滿足條件,但是怎麼才能高效的找出他們 之間的距離呢? 我想到的方式是,他們之間的距離,就是Alice和Bob之間每個單詞的長度,但是光有長度時不夠的,因爲還要算上空格,他們之間空格的個數就是Bob當前的索引j減去Alice當前的索引i,這樣就可以計算出他們之間的距離,就可以判斷是否滿足條件了。無法確定Alice開頭還是Bob開頭,所以寫了兩個for循環。
試題I:後綴表達式
/**
* 輸入N 個+ M個-
*
* @param args
*/
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int m = s.nextInt();
int a[] = new int[n + m + 1];
for (int i = 0; i < a.length; i++) {
a[i] = s.nextInt();
}
int b = 0;
int c = 0;
Arrays.sort(a);
System.out.println(Arrays.toString(a));
for (int i = a.length - 1; i >= 0; i--) {
if (c <= n) {
c++;
b += a[i];
} else {
b -= a[i];
}
}
System.out.println(b);
}
解題思路:要計算他們的最大值,只需要將大值加起來,減去小值就可以了。使用sort將輸入的排序,將前面大的值加起來,減去後面小的值就是計算的最大結果