第十屆藍橋杯java省賽部分題解(適合新手)

以下題解只是個人的理解,如果發現答案有誤或者有更簡潔方式,望大家及時指出!!  部分題解自己還沒有想到更好的方式去解答,如果有更好的解題方式會及時更新。

試題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將輸入的排序,將前面大的值加起來,減去後面小的值就是計算的最大結果

拿到算法題之後,先不要着急敲代碼,先把自己的思路寫到紙上,然後把思路弄好之後,在敲也不遲。遇到一些複雜的問題,先將問題簡化,一步步來。 如果這篇文章對你有幫助,記得點贊吖。

發佈了64 篇原創文章 · 獲贊 50 · 訪問量 9840
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章