尋找連續數中丟失的數
阿新 • • 發佈:2019-01-27
題目如下:
現在有一個數組,其值為從1到10000。由於某次偶然操作,導致這個陣列中丟失了某三個元素,同時順序被打亂,現在需要你用最快的方法找出丟失的這三個元素,並且將這三個元素根據從小到大重新拼接為一個數字,計算其除以7的餘數。
例:丟失的元素為336, 10, 8453,得到的新數字為10368453,除以7的餘數為2.
輸入資料為一行,包含9997個數字,空格隔開。
輸出為一行,包含一個數字。
題目要求用最快的方法去做,但是我沒有深入的思考,用了比較簡單的方法去做。思路大概是這樣:
1.將輸入的資料存放在陣列arr中並從按小到大排序。
2.定義一個變數i從1增長到10000,一個記錄陣列arr下標的指標j,將陣列中的元素和i的值比較,如果arr[j] 不等於 i 說明 i 就是丟失的數。(7考慮連續丟失的數)接著讓 i自增,直到 i 與 arr[j] 相等,j++,i++。還有一個要注意的問題是,丟失的數超過9997,就要控制 j 的增長 否則會出現陣列越界問題。
3.將找到的丟失的數排序,轉換為字串,再拼接起來轉換為整數,在這裡就偷懶了直接調sprintf函式,strcat函式和atoi函式
#include<stdio.h> #include<string.h> #include<stdlib.h> #define TOTAL 9997 void FindTheNum(int *arr, int length, int *find); void my_sort(int *arr, int length); int main() { int i , j; int num[TOTAL]; int find[3]; char str[100]; char temp_str[100]; for(i = 0 ; i < TOTAL; i++) { scanf("%d", &num[i]); } my_sort(num, TOTAL); FindTheNum(num, TOTAL, find); my_sort(find, 3); memset(str, '\0', sizeof(str)); for(i = 0; i < 3; i++) { sprintf(temp_str, "%d", find[i]); strcat(str,temp_str); } printf("%d\n", atoi(str) %7); return 0; } void my_sort(int *arr, int length) { int i, j, temp; if(arr == NULL) return; for(i = 0; i < length; i++) { for(j = i+1; j < length; j++) { if(arr[i] > arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } void FindTheNum(int *arr, int length, int *find) { int i = 0; int j = 0; int k = 0; for(i = 1; i <= length + 3 ; i++) { while(i != arr[j]) { find[k++] = i++; if(k == 3) return; } if(j+1 < length) j++; } }