[蓝蓝计算机考研算法]-day24顺序表元素删除&&合并有序表

29 阅读1分钟

顺序表元素删除

从有序顺序表中删除所有其值重复的元素,使表中元素不重复。

示例

输入:2 2 2 4 8 8 8 9 9
输出:2 4 8 9

思路

  1. 输入数组,用while循环来判断,条件是i<n+1,当输出完成后,用break结束循环即可,所以循环需要一直进行。

  2. 如果a[i]==a[i+1]时,i++,即下标向后走,若前后不相等,则输出前边的。当下标移到最后一个数时,由于没有元素比较,所以直接输出即可。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n=0,x,i=0,a[100];
	while(cin>>x){ //输入数组中的数 
		a[n++]=x;
		if(cin.get()=='\n') break;
	}
	while(i<n+1){ //一直循环 
		if(a[i]==a[i+1]) //当两个数相同,i++ 
			i++;		
		else{
			cout<<a[i]<<" "; //当两个数不同时,输出前边那个 
			i++;	
		}
		if(i==n-1){ //最后一个无法比较,直接输出,退出循环 
			cout<<a[i];
			break;
		}
	}
	return 0;
}

合并有序表

将两个有序表合并成一个新的有序表。

示例

输入:
1 3 6 86 90
4 8 10 52 88

输出:
1 3 4 6 8 10 52 86 88 90

思路

  1. 分别输入两个数组中的数字。

  2. while循环遍历两个数组,条件是下标不能超过数组长度。

  3. 二者从0开始比较,输出小的那一个;当有一个数组下标走到结尾时,即遍历完成后,若另一个数组还有元素,则全部输出,然后break结束循环。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n=0,m=0,a[100],b[100],c,d;
	int i=0,j=0;
	while(cin>>c){ //输入数组a 
		a[n++]=c;
		if(cin.get()=='\n') break;
	} 
	while(cin>>d){ //输入数组b 
		b[m++]=d;
		if(cin.get()=='\n') break;
	}
	while(i<n || j<m){
			if(a[i]<b[j] ){ //输出二者之中较小的 
				cout<<a[i]<<" ";
				i++;
				if(i==n) { //如果a数组遍历完了,把b数组剩下的直接输出 
					for(int x=j; x<m; x++) 
						cout<<b[x]<<" ";
					break; //输出完成后跳出循环 
				}
			}else {
				cout<<b[j]<<" ";
				j++;
				if(j==m){ //如果b数组遍历完了,把a数组剩下的直接输出 
					for(int x=i; x<n; x++)
						cout<<a[x]<<" ";
					break; //输出完成后跳出循环 
				}
			}
	}
	return 0;
}

小结

  • 写代码时有很多不细心的地方,例如两个等号写成一个等号。。。要细心!!!

  • 题目看着是简单,但是在写的时候还是不流畅,平时注意多回顾写过的代码!