PAT乙級——1083(輔助空間)java實現
阿新 • • 發佈:2018-12-08
題目:是否存在相等的差 (20 分)
給定 N 張卡片,正面分別寫上 1、2、……、N,然後全部翻面,洗牌,在背面分別寫上 1、2、……、N。將每張牌的正反兩面數字相減(大減小),得到 N 個非負差值,其中是否存在相等的差?
輸入格式:
輸入第一行給出一個正整數 N(2 ≤ N ≤ 10 000),隨後一行給出 1 到 N 的一個洗牌後的排列,第 i 個數表示正面寫了 i 的那張卡片背面的數字。
輸出格式:
按照“差值 重複次數”的格式從大到小輸出重複的差值及其重複的次數,每行輸出一個結果。
輸入樣例: 8 3 5 8 6 2 1 4 7 輸出樣例: 5 2 3 3 2 2
題目分析及實現
首先還是有一個超時,我用同樣的思路用C++實現了一遍則滿分通過。
網上C的程式碼很多,可以去參考,我這個解題思路是大眾思維。
定義陣列,下標代表差值,元素存放個數,輔助空間法。
差值最大是num-1,還有可以相差為0,則陣列長度為num;然後從後向前遍歷陣列,值大於一則輸出。
其次就是發現腦子一定要清楚,可能我忙了一天,晚上有點累,也可能是做了幾個題,腦子混了,然後一開始很清晰的思路寫著寫著就混了,竟然想自己定義排序寫,寫出來也能實現,就是麻煩了點。
然後休息了一下,腦子清楚了再看題,咦,剛才是被上帝遮住了眼麼?
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int newOrder[] = new int[num + 1];
int[] differ = new int[num];// 最大的差值不會超過num-1,加上0,共num個
Arrays.fill(differ, 0);
//下標代表差值,元素代表相同差值的個數
for ( int i = 1; i < num; i++) {
newOrder[i] = in.nextInt();
int index = Math.abs(newOrder[i] - i);
differ[index]++;
}
in.close();
//從後向前遍歷即可
for (int i = num - 1; i >= 0; i--) {
if (differ[i] > 1)
System.out.println(i + " " + differ[i]);
}
}
}
不止一次的說,PAT 對 java 太不友好了!!!