Data Structure
今天是针对于学习完顺序表后相关的一些例题的联系,注意对于内存的理解:
数组内元素移除
选择数组内的一个元素,对其一样的所有元素进行移除,并保留剩下的数据(注意对于复杂度的运用)
1.指针内存检查
2.创建一个新的变量idx
3.将不需要删除的直接传入到这个新的下面,完了直接返回idx
int removeElement(int* nums, int numsSize, int val){
if (nums == NULL || numsSize = 0)//非空检查
return;
int idx = 0; //创建储存数据的新变量
int i = 0;
for (i = 0; i <= numsSize; ++i){ //循环
if (nums[i] != val){ //将不等的数据直接传入idx
nums[idx++] = nums[i]; //循环传入
}
}
return idx; //返回
}
注意这个思路,有时候创建新的空间,就可以简化这个操作,简化代码行数
数组内删除重复项
这个题目的意思是删除代码中重复的,只保留重复项的一个数据,并进行输出
int removeDuplicates(int* nums, int numsSize){
if (numsSize <= 1)
return numsSize; //非空检查
int i = 0, j = 1, idx = 0; //细节,j比i大1
while (j < numsSize){ //对于j的循环
nums[idx++] = nums[i]; //将第一次出现的赋予idx
if (nums[i] == nums[j]){//出现两个一样的时候
while (j < numsSize&&nums[i] == nums[j]){ //当这两个条件都满足,再进行循环
++j;
i = j; //就像我上面说的将j赋值于i开始新的比对
++j; //循环
}
}
else{
++i; //当不等的时候,依次加加,查看下一组
++j;
}
}
if (i < numsSize)
nums[idx++] = nums[i]; //将尾部没插入的进行插入
return idx; //返回处理完的数据
}
合并两数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int* nums3 = (int*)malloc(sizeof(int)*(m + n)); //开辟一段新的动态内存空间用来利用
int i = 0, j = 0, idx = 0; //赋予初值
//进行同时遍历
while (i<m&&j<n){ //在有效空间内循环
if (nums1[i] <= nums2[j]) //如果j中的数大于i,
nums3[idx++] = nums1[i++]; //将i的先传入到idx,这里的++表示循环,有则继续
else
nums3[idx++] = nums2[i++]; //同上
}
if (i<m) //如果i<m,则证明i中最后又剩余,将其传入3中,反正最终经过对比肯定会有
//一个最大的数保存在m或n中,将其拷贝到idx中
memcpy(nums3 + idx, nums1 + i, sizeof(int)*(m - i));
if (j<n)
memcpy(nums3 + idx, nums2 + j, sizeof(int)*(n - j));
memcpy(nums1, nums3, sizeof(int)*(m + n)); //将建立的动态内存中的数据拷贝到nums1中
free(nums3); //对申请的动态内存进行释放,否则将会造成内存泄漏
}
今天讲的三个练习题不知道大家有没有发现,主要就是一个借调的思想,创建一个新的空间或者变量,将数据直接传入过去,就没必要像以前讲的要每一个数组进行后移,进行前移,这样的比较麻烦,主要就是一个运用第三者的思想,大家牢记,能大大的化简代码,一定程度上也构建了代码的思想.
多敲代码!!一起加油!!!