原地去重问题
这里我们可以使用三个指针来计算去重后一共有多少个值
首先是一个des指针
它负责来记录我们去重后一共有多少值以及用来给它们赋值
然后是begin和一个end指针
这两个指针的作用是用来保证它们的区间内没有任何重复的值
如果出现重复的值的话 那么久将end赋值给begin 并且des++ 之后再次寻找相同的区间
代码表示如下
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int arr[] = { 0,0,1,1,1,2,2,3,3,3,3,4,4,5,6,6,6,7 ,8}; int sz = sizeof(arr)/sizeof(arr[0]); if (sz==0) { return 0; } int begin = 0; int end = 0; int des = 0; while (end<(sz-1)) { if (arr[begin]==arr[end]) { arr[des] = arr[begin]; end++; } else if (arr[begin]!=arr[end]) { begin = end; des++; } } printf("%d", des + 1); return 0; }
至于这里为什么要加一呢? 因为实际上des表示的是数组的下标 下标比实际的元素少一
所以要加一
这里比较关键的有这么一段代码
if (sz==0) { return 0; }
如果说数组的大小其实是0个元素的话 那么其实重复的就是0个
合并有序数组问题
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-sorted-array
我们先来画图分析下问题
这一题也是一个典型的三指针问题 我们可以设立三个指针 一个指向数组m的最末尾位置
一个指向数组n的末尾位置 一个指向数组m的元素个位置
我们可以比较指向m或者n的两个指针的大小
如果说m的大就放在最后面去 m–
反之n就放在最后面去 n–
当数组n指向0位置前面的时候 可以不用变化了
当数组m指向0位置前面之后 还需要将n前面的所有数组迁移到数组m上去
代码表示如下
int main() { int m[8] = { 4,5,6,9,0,0,0,0 }; int n[4] = { 3, 6, 8, 10 }; int m1 = 3; int n1 = 3; int end = 7; while ((n1>=0) && (m1>=0)) { if (m[m1] > n[n1]) { m[end] = m[m1]; end--; m1--; } else { m[end] = n[n1]; end--; n1--; } } while (n1 >= 0) { m[end] = n[n1]; end--; n1--; } for (int i = 0; i < 8; i++) { printf("%d ", m[i]); } return 0; }
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏
希望大佬们看到错误之后能够不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯