???本篇是詳解版???
💖💖💖文章較長建議收藏學習💖💖💖
1.有序序列的判斷
2.有序序列插入一個數字
3.序列中洗掉指定數字
4.序列中整數去重
5.有序序列的合并
1.有序序列的判斷(? / ×)🤔
題目描述
輸入一個整數序列,判斷是否是有序序列,有序,指序列中的整數從小到大排列或者從大到小排序,
輸入描述:
第一行輸入一個整數 N (3 <= N <=50),
第二行輸入 N 個整數,用空格分隔 N 個整數,
輸出描述:
輸出為一行,若有序則輸出" 有序 ",否則輸出'' 無序 '',
題目分析:
1.判斷序列是否有序有兩種情況,升序或者降序,并且只能滿足一種情況. 我們可以先假設整個序列既有升序又有降序為真,經過遍歷以后再判斷是否有序,
int flag1 = 1;//升序有序
int flag2 = 1;//降序有序
//...
//遍歷,判斷是升序還是降序(在該程序對flag1 或 flag2的值進行修改)
//...
if (flag1 + flag2 == 1)//判斷序列是否有序
{
printf("序列有序");
}
else
{
printf("序列無序");
}
2.通過對序列進行遍歷來判斷序列是升序還是降序,進而確定是否有序,
//判斷是否有序
for (i = 0;i < n - 1;i++)
{
//判斷是否升序
if (arr[i] >= arr[i + 1])
{
flag1 = 0;//不是升序
}
//判斷是否降序
if (arr[i] < arr[i + 1])
{
flag2 = 0;
}
3.最后對兩個部分進行整合,
//有序序列的判斷
#include<stdio.h>
int main()
{
int n = 0;
int arr[50] = { 0 };
int flag1 = 1;//升序有序
int flag2 = 1;//降序有序
printf("請輸入陣列大小:\n");
scanf("%d", &n);
int i = 0;
printf("請依次輸入陣列元素:\n");
for (i = 0;i < n;i++)
{
scanf("%d", &arr[i]);
}
//判斷是否有序
for (i = 0;i < n - 1;i++)
{
//判斷是否升序
if (arr[i] >= arr[i + 1])
{
flag1 = 0;//不是升序
}
//判斷是否降序
if (arr[i] < arr[i + 1])
{
flag2 = 0;
}
}
if (flag1 + flag2 == 1)
{
printf("序列有序");
}
else
{
printf("序列無序");
}
return 0;
}
運行結果:


2.有序序列 👉插入👈 一個數字
題目描述
有一個有序數字序列,從小到大排序,將一個新輸入的數插入到序列中,保證插入新數后,序列仍然是升序,
輸入描述:
第一行輸入一個整數(0<=N<=50),
第二行輸入 N 個升序排列的整數,輸入用空格分隔的 N 個整數,
第三行輸入想要插入的一個整數,
輸出描述:
輸出為一行, N +1個有序排列的整數,
題目分析:
1.該題中最核心的問題是如何正確的插入元素,從而保證整個序列仍然是有序的,我們可以從整個序列的最右端(數值最大端)開始,用要插入的元素和序列中的各個元素依次進行比較,并進行交替替換直到最后一個元素,
參考代碼:
//插入,假設要插入的變數為 m
//從陣列的最右端開始,使用 if 當 i 等于-1時插入或者直接令 i 大于-1
for (i = n - 1;i >= -1;i--)
{
if (arr[i] > m)//用要插入的元素和序列中的各個元素依次進行比較,并進行交替替換
{
arr[i + 1] = arr[i];
}
else//找到了正確的位置,直接插入
{
arr[i + 1] = m;
break;
}
}//直到遍歷到最后一個元素,插入
if (i == -1)
{
arr[0] = m;
}
2.完善整個程序
//有序序列插入一個數字
#include<stdio.h>
int main()
{
int n = 0;
//arr是陣列
int arr[20] = { 0 };//陣列大小不要超過20,防止越界
int m = 0;//要插入的元素
//輸入
printf("請輸入陣列元素的個數 n :\n");
scanf("%d", &n);
int i = 0;
printf("請依次輸入 n 個升序排列的整數:\n");
for (i = 0;i < n;i++)
{
scanf("%d", &arr[i]);
}
printf("請輸入要插入的數字:\n");
scanf("%d", &m);
插入
for (i = n - 1;i >= -1;i--)//使用 if 當 i 等于-1時插入或者直接令 i 大于-1
{
if (arr[i] > m)//用要插入的元素和序列中的各個元素依次進行比較,并進行交替替換
{
arr[i + 1] = arr[i];
}
else//找到了正確的位置,直接插入
{
arr[i + 1] = m;
break;
}
}
if (i == -1)//直到遍歷到最后一個元素,插入
{
arr[0] = m;
}
//輸出
for (i = 0;i < n + 1;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
運行結果:

3.序列中?洗掉?指定數字
題目描述:
有一個整數序列(可能有重復的整數),現洗掉指定的某一個整數,輸出洗掉指定數字之后的序列,序列中未被洗掉的數字前后位置沒有發生改變,
輸入描述:
第一行輸入一個整數(0 <= N <=50)
第二行輸入 N 個整數,輸入用空格分隔的 N 個整數,
第三行輸入想要洗掉的一個整數,
輸出描述:
輸出為一行,洗掉指定數字之后的序列,
題目分析:
1.該題中的核心問題在于如何找到指定數字并洗掉,找到指定數字我們可以通過 for() 回圈 和 if() 陳述句來完成,而洗掉指定數字我們可以采用替換(也可以稱之為覆寫)的方法,
//我們假定要洗掉的數字是 m
for (i = 0;i < n;i++)//對陣列進行遍歷
{
if (arr[i] != m)//判斷是否為要洗掉的數字,
{
arr[j++] = arr[i];//若不是依次向前推進,若是則對其進行覆寫
}
}
2.完善整個程序,需要注意的是最后整個陣列元素個數的變化,遍歷的程序也對陣列元素的個數進行了修改,
//序列中洗掉指定數字
#include<stdio.h>
int main()//原理:替換
{
int n = 0;
int arr[50] = { 0 };
int m = 0;
//輸入資料
printf("請輸入陣列大小:\n");
scanf("%d", &n);
int i = 0;
int j = 0;
printf("請依次輸入陣列元素:\n");
for (i = 0;i < n;i++)
{
scanf("%d", &arr[i]);
}
printf("請輸入要洗掉的元素:\n");
scanf("%d", &m);
for (i = 0;i < n;i++)//對陣列進行遍歷
{
if (arr[i] != m)//判斷是否為要洗掉的數字
{
arr[j++] = arr[i];//若不是依次向前推進,若是則對其進行覆寫
}
}
for (i = 0;i < j;i++)//注意,遍歷的程序也對陣列元素的個數進行了修改
{
printf("%d ", arr[i]);
}
return 0;
}
運行結果:

4.序列中整數去重(?🎁🎁🎁)
題目描述:
輸入 n 個整數的序列,要求對這個序列進行去重操作,所謂去重是指對這個序列中的每個重復出現的整數,只保留該數第一次出現的位置,洗掉其余位置,
輸入描述:
輸入包含兩行,第一行包含一個正整數 n(1<= n <= 1000),表示第二行序列中數字的個數;第二行包含 n 個整數(范圍1~5000),用空格分隔,
輸出描述:
輸出為一行,按照輸入的順序輸出去重之后的數字,用空格分隔,
題目分析:
1.該題中的重點是如何對陣列進行去重操作,我們這里采用前后覆寫的方法,對兩個前后相鄰的兩個元素進行比較,若相等則后一個元素將前一個元素覆寫掉,并且同時對覆寫之后的陣列元素個數對應的下標進行修改,
//去重
for (i = 0;i < n;i++)
{
int j = 0;
for (j = i + 1;j < n;j++)
{
if (arr[i] == arr[j])//判斷兩個前后相鄰的元素是否重疊
{
//把下表為 j 的位置覆寫掉
int k = 0;
for (k = j;k < n - 1;k++)
{
arr[k] = arr[k + 1];
}
n--;//修改去重后元素個數以及坐標的變化
j--;
}
}
}
2.完善整個程式,
//整數去重,覆寫法,不會受到范圍的限制
#include<stdio.h>
int main()
{
int n = 0;
int arr[100] = { 0 };
//輸入
printf("請輸入陣列大小:\n");
scanf("%d", &n);
int i = 0;
printf("請依次輸入陣列元素:\n");
for (i = 0;i < n;i++)
{
scanf("%d", &arr[i]);
}
//去重
for (i = 0;i < n;i++)
{
int j = 0;
for (j = i + 1;j < n;j++)
{
if (arr[i] == arr[j])//判斷前后兩個相鄰的元素是否有重疊
{
//把下表為 j 的位置覆寫掉
int k = 0;
for (k = j;k < n - 1;k++)
{
arr[k] = arr[k + 1];
}
n--;//修改去重后元素個數以及坐標的變化
j--;
}
}
}
//輸出
for (i = 0;i < n;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
運行結果:

5.有序序列的💕合并💕
題目描述:
輸入兩個升序排列的序列,將兩個序列合并為一個有序序列并輸出,
輸入描述:
輸入包含三行,
第一行包含兩個整數 n , m (1 <= n , m <=100) , 用空格分隔,n 表示第二行第一個升序序列中數字的個數,m 表示第三行第二個升序序列中數字的個數,
第二行包含 n 個整數(范圍1~5000),用空格分隔,
第三行包含 m 個整數(范圍1~5000),用空格分隔,
輸出描述:
輸出為一行,輸出長度為 n+m 的升序序列,即長度為 n 的升序和長度為 m 的升序序列中的元素重新進行升序序列排列合并,
題目分析:
1.該題的核心是對兩個有序序列的合并,并且合并之后的序列依然是有序序列,我們采用的方法是創建兩個變數來表示兩個陣列的下標,通過回圈和兩個下標的比較來對前 n 個或者前 m 個元素進行有序列印,之后再列印剩下的元素,
//有序序列的輸出
i = 0;//用來遍歷arr1陣列
int j = 0;//用來遍歷arr2陣列
while (i < n && j < m)//對相應序列的前 n 個或者前 m 個進行有序輸出
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n)// n 的個數較大,由于開始就是有序序列,直接對之后的序列進行輸出
{
for (;j < m;j++)
{
printf("%d ", arr2[j]);
}
}
else
{
for (;i < n;i++)// m 的個數較大,由于開始就是有序序列,直接對之后的序列進行輸出
{
printf("%d ", arr1[i]);
}
}
2.完善整個程式
//有序序列的合并
int main()
{
int n = 0;
int m = 0;
int arr1[100] = { 0 };
int arr2[100] = { 0 };
//輸入
printf("請輸入兩陣列的大小 n 和 m:\n");
scanf("%d %d", &n, &m);
int i = 0;
printf("請輸入第一個陣列元素:\n");
for (i = 0;i < n;i++)
{
scanf("%d", &arr1[i]);
}
printf("請輸入第二個陣列元素:\n");
for (i = 0;i < m;i++)
{
scanf("%d", &arr2[i]);
}
//有序序列的輸出
i = 0;//用來遍歷arr1陣列
int j = 0;//用來遍歷arr2陣列
while (i < n && j < m)//對相應序列的前 n 個或者前 m 個進行有序輸出
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n)// n 的個數較大,由于開始就是有序序列,直接對之后的序列進行輸出
{
for (;j < m;j++)
{
printf("%d ", arr2[j]);
}
}
else
{
for (;i < n;i++)// m 的個數較大,由于開始就是有序序列,直接對之后的序列進行輸出
{
printf("%d ", arr1[i]);
}
}
return 0;
}
運行結果:

在文章的最后,小作者再次送給每位讀者一個大大的贊:
:
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/293398.html
標籤:其他
上一篇:解決跨域問題
