1. 程式人生 > >藍橋杯歷屆試題 錯誤票據

藍橋杯歷屆試題 錯誤票據

藍橋杯歷屆試題 錯誤票據

題目

問題描述
某涉密單位下發了某種票據,並要在年終全部收回。

每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。

因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。

你的任務是通過程式設計,找出斷號的ID和重號的ID。

假設斷號不可能發生在最大和最小號。

輸入格式
要求程式首先輸入一個整數N(N<100)表示後面資料行數。

接著讀入N行資料。

每行資料長度不等,是用空格分開的若干個(不大於100個)正整數(不大於100000),請注意行內和行末可能有多餘的空格,你的程式需要能處理這些空格。

每個整數代表一個ID號。

輸出格式
要求程式輸出1行,含兩個整數m n,用空格分隔。

其中,m表示斷號ID,n表示重號ID

樣例輸入1
2
5 6 8 11 9
10 12 9
樣例輸出1
7 9
樣例輸入2
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
樣例輸出2
105 120

解題思路

1、這道題目看似很簡單,實際上也很簡單。
2、分解題目,接收使用者輸入的有效資料。

  • 因為使用者輸入每行的個數不一樣。 這裡介紹幾個常用的api便於我們處理資料。
  • sc.nextLine();:表示對資料的讀取,一次性讀取一行。用String接收後可進行相應處理。
  • split();:分割字串返回的是一個String陣列,舉例:
    String a = “abcdeAfghijk”;
    String [] b = a.split(“A”);//以A作為分割點,將字串a分割為2個字串陣列分別為
    b[0] = “abce”;
    b[1] = “efghijk”
  • Integer.valueOf(String);將字串型別資料轉換為int;便於後面排序及計算。

3、對資料進行排序處理。
4、尋找斷號。後一位比前一位大於1以上即表示斷號。
5、尋找重號。前後兩位資料一樣即表示重號。

//java程式碼

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//接收使用者輸入的資料並將資料存入二維陣列str1中
		int n = sc.nextInt();
		String[][] str = new String[n + 1][];
		int[] num = new int[n * 100];//因為每行輸入個數不定故採用最大值
		for (int i = 0; i <= n; i++) {
			str[i] = sc.nextLine().split(" ");
		}
		//String陣列轉型為int,並存入sum陣列中
		int k = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 0; j < str[i].length; j++) {
				num[k] = Integer.valueOf(str[i][j]);
				k++;
			}
		}
		//剔除陣列num空餘位置
		int[] newnum = new int[k];
		for (int i = 0; i < k; i++) {
			newnum[i] = num[i];
		}
		//排序
		Arrays.sort(newnum);
		long x = 0;//儲存斷號
		long y = 0;//儲存重號
		//尋找斷號
		for (int i = 1; i < newnum.length; i++) {
			if (newnum[i]-newnum[i - 1]>1) {
				x = newnum[i]-1;
				break;
			}
		}
		//尋找重號
		for (int i = 1; i < newnum.length; i++) {
			if (newnum[i] == newnum[i - 1]) {
				y = newnum[i];
				break;
			}
		}
		//輸出斷重號
		System.out.println(x + " " + y);
	}