1. 程式人生 > >PAT乙級——1083(輔助空間)java實現

PAT乙級——1083(輔助空間)java實現

題目:是否存在相等的差 (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 太不友好了!!!