学会LeetCood三道题

在这里插入图片描述

系列文章目录



前言


在这里插入图片描述

一、数组中数字出现的次数

数组中数字出现的次数

1.题目描述

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

在这里插入图片描述
在这里插入图片描述

2.解题思路

  1. 先把数组中所有的数异或一遍,相同数就会异或为0,不同的数会异或得到一个数。
  2. 找到这个数的结果中第j位为1。(一个int型有32位,任意找一位为1)。
  3. 把j位为1的数分配为a组,j位为0的数分配为b组,相同的数要么在a组,要么在b组。
  4. 不同的数就会分配一个a组,一个b组。
  5. 再对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.解题思路

  1. 第一种解法,把不是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;
}
  1. 第二种解法两个下标同时出发
    在这里插入图片描述

代码如下:

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.解题思路

  1. 定义三个下标dest=0、cur=0、next=1
  2. 判断下标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中几道数组类型的题目,对我们以后是非常重要的,我们务必掌握!另外,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44918090/article/details/115441946