刷题小结 【序列篇】序列合并、增删改元素
小编今天写了几道有序序列的数据处理问题涉及到了序列的合并、增删改这些问题觉得比较有代表性这里就把我的写题思路和心得分享给大家【有序序列判断】最初自己写的时候想的是升序和降序分开判断但是在写判断的过程中我写成了这样的逻辑当前面的元素小于后面的元素arr[i]arr[i1]就判定是有序当前面的元素大于后面的元素arr[i]arr[i1]就判定是有序这样会导致一个错误就是只要有一组是这样的大小关系就判定整个数组是有序的很显然不是这样的后面想到直接用一票否决的方式在同一个循环里把有序分为升序和降序只要有一对数据是前面的元素小于后面的元素arr[i]arr[i1]就判定不是降序只要有一对数据是前面的元素大于后面的元素arr[i]arr[i1]就判定不是升序当然这里还有一个被忽略掉的错误就是我们进行比较的时候是拿前一项arr[i]和后一项arr[i1]进行比较所以当i取到n-1的时候arr[i1]取到的就是arr[n]这样的话数组就越界了。所以循环的终止条件应当写成in-1【有序序列的合并】首先合并后的数组长度等于两个合并前数组的长度之和可以分为两步来实现1、从两个数组里面拿出来放到最终数组里面此时都还没有拿完元素2、有一个数组的元素已经拿完了那就把剩下的那个数组的元素直接放进去即可所以三个while循环对应着三种情况分别是都还有的来拿已经拿完了一个把剩下的直接补进去。while(in)// arr1还有剩全部放进去arr[k]arr1[i];while(jm)// arr2还有剩全部放进去arr[k]arr2[j];【有序序列中插入一个数】既然是插入一个数据那我们刚开始就把数组的大小设为n1但是要注意在**塞进数据去的时候条件应该是in**等数据输入完以后我们就可以利用最后一个剩余的空位直接把要插入的数据放到最后去然后我们就对整个数据进行排序使用sort()函数实现最后再将数组给输出来得到的就是插入以后仍然有序的数据【序列中删除指定数字】//错误提交#includeiostreamusing namespace std;intmain(){intn0;cinn;intarr[n];for(inti0;in;i){cinarr[i];}intd0;cind;intconn;for(inti0;in;i){if(arr[i]d){arr[i]arr[i1];//这样处理的话如果数组里面有连续相同的数字和要删的数字相等删不干净con--;}}for(inti0;icon;i){coutarr[i] ;}return0;}//提交版本#includeiostreamusing namespace std;intmain(){intn0;cinn;intarr[n];for(inti0;in;i){cinarr[i];}intd0;cind;intconn;inti0;while(icon){if(arr[i]d){for(intji;jcon;j){arr[j]arr[j1];}con--;}else{i;}}for(inti0;icon;i){coutarr[i] ;}return0;}我们可以用一个有效数字con来确定最终的数组大小while循环里条件的意义是只要我当前检查的位置还在有效元素的范围内就继续循环如果找到这个数d另设一个变量j给到i避免混淆将后一项的值给到前一项如果没找到那么就继续往后找。i最后从头到有效范围内输出最后的数据//方法2intmain(){intn0;cinn;intarr[n];for(inti0;in;i){cinarr[i];}intd0;cind;intp0;for(inti0;in;i){if(arr[i]!d){arr[p]arr[i];}}for(inti0;ip;i){coutarr[i] ;}return0;}这个方法的和上一个方法有相同之处都另设了一个变量相当于一个指针这里是p这里我是用i来控制数组的遍历用p来确定更改后的数据同时这里的p最终也能确定下来有效数据的长度便于后期打印结果如果当前数组内的当前数据不是要删的数据那就把它存到p里面同时p往后移动所以如果不是要删除的元素就不会存到里面去当最终遍历完数组p也就把不需要删除的元素都存了起来所以最后打印p就是最后的长度#includeiostreamusing namespace std;intmain(){intn0;cinn;intarr[n];for(inti0;in;i){cinarr[i];}intf[1000];intp0;for(inti0;in;i){bool has0;intj0;for(j0;jp;j){if(f[j]arr[i]){has1;break;}}if(!has){f[p]arr[i];}}for(inti0;ip;i){coutf[i] ;}return0;}首先我们要注意到题目的要求是把重复的数字删掉仅保留第一次它出现的位置我们可以用一个数组f[1000]来存储最终打印的结果序列同样和删除序列元素一样定义一个p变量它可以记录数组中最后有几个数先在数组中遍历假设一开始没有重复bool has0;额外设定一个变量j来进行f[]中元素与原来arr[]数组中元素的比较如果发现相等那就说明重复就不能将它放进最终要打印出来的数组里面去跳出如果不重复就将它放入最后打印的数组里面最终我们由p就确定下来了打印结果数组的大小将它输出来就可以了好了今天的分享就到这里如果有不正确的地方还望大家帮忙指正哦