系列文章目录
前言
一、数组中数字出现的次数
1.题目描述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
2.解题思路
- 先把数组中所有的数异或一遍,相同数就会异或为0,不同的数会异或得到一个数。
- 找到这个数的结果中第j位为1。(一个int型有32位,任意找一位为1)。
- 把j位为1的数分配为a组,j位为0的数分配为b组,相同的数要么在a组,要么在b组。
- 不同的数就会分配一个a组,一个b组。
- 再对a组、b组的数异或,相同的数被异或掉,剩下的就是结果数字。
代码如下:
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{
int x=0;
int y=0;
int ret=0;
int i=0;
for(i=0;i<numsSize;i++)
{
ret=ret^nums[i];
}
int j=0;
for(j=0;j<numsSize;j++)
{
if((ret>>j&1))
{
break;
}
}
int k=0;
for(k=0;k<numsSize;k++)
{
if(nums[k]>>j&1)
{
x=x^nums[k];
}
else
{
y=y^nums[k];
}
}
int* arr=(int*)malloc(sizeof(int)*2);
arr[0]=x;
arr[1]=y;
//把实参地址传给形参,那么形参可以通过解引用改变实参
*returnSize=2;
return arr;
}
二、移除元素
1.题目描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素
2.解题思路
- 第一种解法,把不是val的元素移动到新数组中
代码如下:
int RemoveElement(int *arr, int sz, int val) //把不是val的值存放到另一个数组中
{
int i = 0;
int j = 0; //创建一个新数组
for (i = 0; i < sz; i++)
{
if (arr[i] != val)
{
arr[j] = arr[i];
j++;
}
}
return j;
}
- 第二种解法两个下标同时出发
代码如下:
int RemoveElement(int* arr, int sz, int val) //两个变量同时出发
{
int dest = 0;
int src = 0;
while (src < sz)
{
if (arr[src] == val)
{
src++;
}
else
{
arr[dest] = arr[src];
src++;
dest++;
}
}
return dest;
}
三、删除有序数组中重复项
1.题目描述
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
2.解题思路
- 定义三个下标dest=0、cur=0、next=1
- 判断下标cur的值和下标next相等和不相等的情况
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int RemoveElement(int arr[], int sz)
{
if (sz == 0)
{
return 0;
}
int dest = 0;
int cur = 0;
int next = 1;
while (next < sz)
{
if (arr[cur] != arr[next])
{
arr[dest] = arr[cur];
dest++;
cur++;
next++;
}
else
{
while ( next<sz && arr[cur] == arr[next])
{
next++;
}
arr[dest] = arr[cur];
dest++;
cur = next;
next++;
}
}
if (cur < sz)
{
arr[dest] = arr[cur];
dest++;
}
return dest;
}
int main()
{
int arr[] = {
1, 1, 2, 3, 4, 5, 5, 6, 7 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = RemoveElement(arr, sz);
printf("%d\n", ret);
return 0;
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了LeetCood中几道数组类型的题目,对我们以后是非常重要的,我们务必掌握!另外,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。