Data Structure--例题(1)--数组内的元素移除--删除重复项--合并数组

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);	//对申请的动态内存进行释放,否则将会造成内存泄漏
}

今天讲的三个练习题不知道大家有没有发现,主要就是一个借调的思想,创建一个新的空间或者变量,将数据直接传入过去,就没必要像以前讲的要每一个数组进行后移,进行前移,这样的比较麻烦,主要就是一个运用第三者的思想,大家牢记,能大大的化简代码,一定程度上也构建了代码的思想.
多敲代码!!一起加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值