当前位置:   article > 正文

顺序表基础练习(C语言实现)_顺序表题目c语言

顺序表题目c语言

目录

顺序表练习

移除元素

删除有序数组中的重复项

合并两个有序数组


顺序表练习

移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地  修改输入数组
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路解析:

使用快慢指针法,快指针先走,慢指针后走,二者每次都走一步,如果数组中的数据等于val时,只让快指针走,否则将快指针中的数据给慢指针所在的位置,再让快指针和慢指针同时走,最后返回慢指针的值即为修改后的数组(注意后面虽然仍有数据,但是返回的长度限制了访问的范围,相当于“看不见等于删除”)

参考答案:

  1. /*
  2. * @lc app=leetcode.cn id=27 lang=c
  3. *
  4. * [27] 移除元素
  5. */
  6. // @lc code=start
  7. int removeElement(int *nums, int numsSize, int val)
  8. {
  9. int fast = 0;
  10. int slow = 0;
  11. while (fast < numsSize)
  12. {
  13. if (nums[fast] == val)
  14. {
  15. fast++;
  16. }
  17. else
  18. {
  19. nums[slow] = nums[fast];
  20. slow++;
  21. fast++;
  22. }
  23. }
  24. numsSize = slow;
  25. return numsSize;
  26. }
  27. // @lc code=end

删除有序数组中的重复项

题目链接:26. 删除有序数组中的重复项 - 力扣(LeetCode)

给你一个 非严格递增排列 的数组 nums ,请你  原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。 nums 的其余元素与 nums 的大小不重要。返回 k

思路解析:

本题和上一题思路类似,同样是用两个指针,一个为dst,另一个src,当数组的数据等于val时,只移动一个指针src,当数据不等于val时,将src中的值给dst所在位置的后一个位置,再移动srcdst,并且两个指针移动一步,最后返回dst+1

参考答案:

  1. /*
  2. * @lc app=leetcode.cn id=26 lang=c
  3. *
  4. * [26] 删除有序数组中的重复项
  5. */
  6. // @lc code=start
  7. int removeDuplicates(int *nums, int numsSize)
  8. {
  9. int src = 1;
  10. int dst = 0;
  11. while (src < numsSize)
  12. {
  13. if (nums[src] == nums[dst])
  14. {
  15. src++;
  16. }
  17. else
  18. {
  19. nums[dst + 1] = nums[src];
  20. src++;
  21. dst++;
  22. }
  23. }
  24. return dst + 1
  25. }
  26. // @lc code=end

合并两个有序数组

题目链接:88. 合并两个有序数组 - 力扣(LeetCode)

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

思路解析:

使用三个指针,一个指针l3指向合并的数组的最后一个元素位置,一个指针l2指向合并的数组的初始有效数值位,最后一个指针l1指向第二个数组的最后一个元素的位置,将l1所在位置的元素与l2所在位置的元素比较,如果满足:

  1. nums1[l1] > nums2[l2],将l1的值放置在l3指向的位置,再移动l3和l1
  2. nums1[l1] <= nums2[l2],将l2的值放置到l3指向的位置,再移动l3和l2
  3. 最后如果nums1数组先走到终点,则将nums2数组的元素依次放置到合并的数组中,同时移动指向l2指针和l3指针
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/829297
推荐阅读
相关标签