【数据结构】_顺序表_相关面试题

本节我们将对顺序表相关数组题进行详细分析

下面就开始叭!🎈🎈🎈

1.移除元素

题目 :给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
要求 :不要使用额外的数组空间,你必须仅使用 O(1)额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。

画图分析:

代码运行:

c 复制代码
void Swap(int* p1, int* p2) {
    int tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
}

int main() {
    int arr[] = { 1, 3, 4, 3, 5, 3 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    //要删除的元素
    int k = 3;

    // 双指针法:将非3元素前移
    //目标指针
    int* dst = arr;
    //遍历数组指针
    int* src = arr;
    for (src; src < arr + sz; src++)
    {
        if (*src != k) 
        {
        //将src指向的元素复制到dst上
            *dst = *src;
            dst++;
        }
    }

    // 计算剩余元素数量
    int remain = dst - arr;

    // 打印结果
    for (int i = 0; i < remain; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

运行结果:

2...删除有序数组中的重复项

题目:

输入: nums = 0,0,1,1,1,2,2,3,3,4

输出: 5,nums = 0,1,2,3,4
解释: 函数应该返回新的长度5,并且原数组 nums 的前五个元素被修改为0,1,2,3,4。不需要考虑数组中超出新长度后面的元素。

画图分析:

代码运行:

c 复制代码
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
int main()
{
	int arr[] = { 0,0,1,1,2,2,3,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//开始指针
	int* sta = arr;
	//遍历指针
	int* dst = arr;
	//末尾指针
	int* end = arr + sz;//指向数组后面这个元素
	int num = 0;//用于记录去重后数组中元素的个数(不包括第一个元素),初始值为 0
	while (dst < end)
	{
		if (*sta == *dst)
		{
			dst++;
		}
		else
		{
			sta++;//注意这里要先挪再交换
			Swap(dst, sta);//交换
			dst++;
			num++;//?
		}
	}
	int i = 0;
	for (i = 0; i <= num; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

注意num的使用技巧:

在这段代码中,num 变量的主要作用是记录去重后数组中除第一个元素之外的元素个数。由于原数组是有序的,第一个元素必然会被保留在去重后的数组中,所以num0开始计数,每发现一个与前面元素不同的新元素,num 的值就加 1。最终,num + 1 就代表了去重后数组的元素总数。

dst指针遍历完整个数组后,循环结束。此时 num 的值表示去重后数组中除第一个元素外的元素个数。++对于数组 {0, 0, 1, 1, 2, 2, 3, 3, 4},去重后的数组为 {0, 1, 2, 3, 4},num 的最终值为 4,代表除第一个元素 0 外,还有 4 个不同的元素。++

运行结果:

3.归并数组

题目: 给你两个按非递减顺序排列的整数数组 nums1nums2 ,另有两个整数m n分别表示 nums1 nums2中的元素数目。请你合并nums2nums1 中,使合并后的数组同样按非递减顺序排列。
注意: 最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况, numsl 的初始长度为 m+n,其中前 m个元素表示应合并的元素,后 n个元素为0,应忽略。nums2 的长度为 n

题目解析:

画图解析:

代码运行:

c 复制代码
int main()
{
	int arr_1[10] = { 0,1,2,3,6 };
	int arr_2[5] = { 1,1,3,4,5 };
	int end_1 = 4;
	int end_2 = 4;
	int end = sizeof(arr_1) / sizeof(arr_1[0]) - 1;
	//两个数组end下标都>=0表示没有走完
	while (end_1 >= 0 && end_2 >= 0)
	{
		//如果第一个数组元素大于等于第二个,那么先放第一个
		if (arr_1[end_1] >= arr_2[end_2])
		{
			//这里是先将end_1的值赋值到end 然后再--
			arr_1[end--] = arr_1[end_1--];//注意这里先赋值再减减
		}
		else
		{
			arr_1[end--] = arr_2[end_2--];
		}
	}
	//数组一:end_1走完了,直接将end_2压入到前面
	while (end_2 >= 0)
	{
		arr_1[end--] = arr_2[end_2--];
	}
	//数组二:end_2走完了,那么就不需要考虑end_1,因为2压到后面,1是有序的直接排好了
	//遍历打印
	int i = 0;
	for (i = 0; i < sizeof(arr_1) / sizeof(arr_1[0]); i++)
	{
		printf("%d ", arr_1[i]);
	}
	return 0;
}

运行结果:

🎉🎉🎉

在这里本章就完结啦~

我们下期见噢~

相关推荐
LuminousCPP7 小时前
数据结构‑二叉树(二):二叉堆从零实现|Heap结构设计 + 建堆优化 + 堆排序深度解析
c语言·数据结构·笔记·二叉树
9 小时前
数据结构第一课:复杂度解析
数据结构
欧叶冲冲冲11 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
_Narcissus_12 小时前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
Lyyaoo.12 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
疯狂打码的少年13 小时前
【数据结构】八大排序算法对比总结(时间/空间/稳定性)
数据结构·笔记·算法
Awh-18 小时前
数据结构 第六章:哈希存储
数据结构·算法·哈希算法
TAN-90°-19 小时前
Deep Learning for Computer Vision——Recurrent Neural Networks
数据结构·人工智能·rnn·深度学习·神经网络·机器学习·计算机视觉
wabs66619 小时前
关于栈【力扣150.逆波兰表达式求值的思考】
数据结构·c++·算法·leetcode··代码随想录
闻缺陷则喜何志丹19 小时前
【计算几何 第10章】更多几何数据结构:截窗
数据结构·数学·线段树·计算几何·截窗·优先查找树·区间树