兩天沒有更新了,貼紙們,有沒有想我呀。😄😄😄
好了,就寒暄到這里吧,下面請看題:
有序序列判斷
輸入一個整數序列,判斷是否是有序序列,有序,指序列中的整數從小到大排序或者從大到小排序(相同元素也視為有序
輸入描述:
第一行輸入一個整數N(3≤N≤50)。
第二行輸入N個整數,用空格分隔N個整數。
輸出描述:
輸出為一行,如果序列有序輸出sorted,否則輸出unsorted。
判斷是否為有序序列,可能是升序還可能是降序,所以我們就可以設計一個函數來判斷是不是有序序列,那么我們怎么實現呢?首先我們假設是升序的,那么我們就以這個條件進去,然后以某一個值為有序狀態,然后我們再里面進行判斷,如果有相反情況,那么我們就改變剛才假設有序狀態的值,改為無序狀態。之后我們再在主函數中,根據返回的值進行判斷有序還是無序!:
int sort(int arr[], int n)
{if (arr[0] >= arr[1]){int flag = 0;//假設flag為0的時候為有序狀態for (int j = 0; j < n - 1; j++){if (arr[j] < arr[j + 1]){flag = 1;//因為我們前面假設的是升序,這里前一位大于后一位的話,就不是有序 // 狀態了,那么此時我們就變為無序狀態}}return flag;}else {int flag = 0;for (int j = 0; j < n - 1; j++){if (arr[j] > arr[j + 1]){flag = 1;}}return flag;}
}
主函數里,我們就很好寫了:
int sort(int arr[], int n)
{if (arr[0] >= arr[1]){int flag = 0;for (int j = 0; j < n - 1; j++){if (arr[j] < arr[j + 1]){flag = 1;}}return flag;}else {int flag = 0;for (int j = 0; j < n - 1; j++){if (arr[j] > arr[j + 1]){flag = 1;}}return flag;}
}int main()
{int n = 0;scanf("%d", &n);int arr[50];for (int i = 0; i < n; i++){scanf("%d",&arr[i]);}int ret = sort(arr, n);//根據返回的值進行判斷是否有序if (ret == 1){printf("unsorted");}else{printf("sorted");}return 0;
}
我們來看看運行結果:
有序序列插入一個整數
有一個有序數字序列,從小到大排序,將一個新輸入的數插入到序列中,保證插入新數后,序列仍然是升序。
輸入描述:
第一行輸入一個整數N(0≤N≤50)。
第二行輸入N個升序排列的整數,輸入用空格分隔的N個整數。
第三行輸入想要進行插入的一個整數。
輸出描述:
輸出為一行,N+1個有序排列的整數。
插入一個數到升序序列中,而且保證插入后還是一個升序序列!怎么想這道題呢?這里的要求是插入一個數,那么我們一個數有一個數的做法,有一些是兩個有序序列進行排序!那么我們很容易想到用這個數字與這個序列進行比較,如果小于這個數,那么我們就打印我們的原序列的數,如果大于我們這個數,那我們此時就是打印我們的目標數,那么現在我們就以這個思路去實現我們的代碼:
int main()
{int n = 0;scanf("%d", &n);int arr[50];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}int num = 0;scanf("%d", &num);for (int i = 0; i < n; i++){if (arr[i] < num){printf("%d ", arr[i]);}else{printf("%d ", num);} }return 0;
}
此時我們來看看運行的結果:
?我們根據運行的結果可以看出,當我們找到插入數的位置后,我們之后的數都是打印的是我們的插入的那個數。那么此時我們可以想,那當我們的插入數插到屬于它自己的位置時,此時我們就不回去循環了。我們可以重新寫一個循環呀,打印原序列后面的數不就好了嘛,我們打印完后,我們就跳出整個循環!:
int main()
{int n = 0;scanf("%d", &n);int arr[50];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}int num = 0;scanf("%d", &num);for (int i = 0; i < n + 1; i++)//因為我們插入了一個數,所以多了一次循環{if (arr[i] < num){printf("%d ", arr[i]);}else{printf("%d ", num);//因為是插入一個,所以我們就打印之后的序列的數就好了。for (int j = i; j < n; j++){printf("%d ", arr[j]);}break;//打印完后跳出整個循環就over了!}}return 0;
}
?我們來看看此時的運行結果:
序列中刪除指定數字
有一個整數序列(可能有重復的整數),現刪除指定的某一個整數,輸出刪除指定數字之后的序列,序列中未被刪除數字的前后位置沒有發生改變。
輸入描述:
第一行輸入一個整數(0≤N≤50)。
第二行輸入N個整數,輸入用空格分隔的N個整數。
第三行輸入想要進行刪除的一個整數。
輸出描述:
輸出為一行,刪除指定數字之后的序列。
序列中刪除指定的數字,而且可能序列中有相同的整數,那么也可能是相鄰的相同的數。那么我們還是要與序列中的數進行比較,如果不相同的話,那么我們就打印出序列中的數。如果相同的話,我們就刪除序列中的數:
int main()
{int n = 0;scanf("%d", &n);int arr[50];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}int num = 0;scanf("%d", &num);for (int i = 0; i < n; i++){if (arr[i] > num || arr[i]<num){printf("%d ", arr[i]);} else{}}return 0;
}
此時我們的問題是怎樣刪除我們的數,那我們可以由后面一位數來替代該位需要刪除的數:
arr[i] = arr[i + 1];
而且還要注意可能有相鄰的相同的數!那么我們在序列中的數與該數相同時我們是不是還應該弄一個循環,判斷是否有相鄰的相同數,直到不相等了,我們才跳出去!
while (arr[i] == arr[i + 1])
{arr[i] = arr[i + 1];i++;
}
我們來看看整體的代碼:
int main()
{int n = 0;scanf("%d", &n);int arr[50];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}int num = 0;scanf("%d", &num);for (int i = 0; i < n; i++){if (arr[i] > num || arr[i]<num){printf("%d ", arr[i]);} else{while (arr[i] == arr[i + 1]){arr[i] = arr[i + 1];i++;}}}return 0;
}
我們來看看運行的結果:
?我們來梳理一下該過程:假設序列不等于要刪除的數,我們就直接打印該序列中的數就可以了,如果等于該序列的數,我們先判斷有沒有相鄰的相同的數,如果沒有,那么我們就不用執行,這一位就不用打印,就直接跳到上面for循環給i++,跳到下一位進行判斷!如果有相鄰相同的,我們就進入while循環,把后一位的值賦值給前一位,然后i++,直到不相等為止!假設我們有兩位相鄰的,那么我們的while循環就執行了一次,i就加了一次,然后到上面for循環處還要加一次,總共加了我們的兩次,就是跳過我們的這兩位咯,你懂了嗎?學會了?還是學廢了?哈哈,如果還是不太懂的話,可以自己去調試哦!
序列中整數去重
輸入n個整數的序列,要求對這個序列進行去重操作。所謂去重,是指對這個序列中每個重復出現的整數,只保留該數第一次出現的位置,刪除其余位置。
輸入描述:
輸入包含兩行,第一行包含一個正整數n(1 ≤ n ≤ 1000),表示第二行序列中數字的個數;第二行包含n個整數(范圍1~5000),用空格分隔。
輸入描述:
輸出為一行,按照輸入的順序輸出去重之后的數字,用空格分隔。
序列中整數的去重,且保留該數第一次出現的位置。哇,這題是一道比一道變態啊!😵😵😵
既然序列中的每一個元素都要去看的話,那么我們就拿出第一位去和后面的每一位進行比較,看看后面有沒有,如果有那么我們就刪除或者向上面那樣的跳過,第一位比較完后,我們接著要拿出第二位去與后面的進行比較了,既然怎樣的話,那么我們還是可以寫出下面的代碼的:
int main()
{int n = 0;scanf("%d", &n);int arr[1000];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}for (int i = 0; i < n; i++){for (int j = i+1; j < n; j++){if (arr[i] == arr[j]){//待思考的內容}}}return 0;
}
既然它要刪除的話,那就是我們的跳過或者移位,如果跳過的話,那么我們再雙重循環里面又該怎樣打印?那么我們就先選擇一位看看,把后面的那一位移到這一位來,就把后面的整體像前面移一位。移動完后,我們再接著從后面一位進行排查,如果還有我們又接著移,直到排查完畢!這個思路好像可以勒哈。那么我們移動一整次,是不是我們的n就要減少一次呢,因為我們移動了之后就會減少一位嘛,所以n應該減減。但是我們此時還要注意一個問題,我們的j也應該減減,因為再我們下一次判斷下一位時,是從刪除那位的位置開始排查著走的,因為我們到上面for循環去的話,j還要加加,所以我們這里j還要減減!
int main()
{int n = 0;scanf("%d", &n);int arr[1000];for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}for (int i = 0; i < n; i++){for (int j = i+1; j < n; j++){if (arr[i] == arr[j]){for (int a = j; a < n - 1; a++){arr[a] = arr[a + 1];}n--;j--;}}}for (int i = 0; i < n; i++){printf("%d ", arr[i]);}return 0;
}
我們來看看運行結果:
?今天就到這里了,拜拜了,好夢!