之前写了一篇重点是讲理论,今天重点在于对于题目的分析
题目难度不分先后,有题目来源会直接给出链接或者位置
第一题:消失的数字
题目来源:LeetCode消失的数字
 
 
 
 
分析
第一种思路分析:
         参考代码:
 参考代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int find_disappear(int nums[], int len)
{
	int res = -1;//保存结果,-1代表值没有被改变
	//先对数组进行排序
	sort(nums, nums + len);//需要两个参数,数组头指针与指针,但是这里不包括尾指针,所以指向数组越界的位置
	for (int i = 0; i < len; i++)
	{
		if (i != nums[i]) 
		{
			//这里直接缺少的就是i
			res = i;
		}
	}
	
	//这里就是没有匹配到的情况,就是最大的索引
	if (res ==  -1) 
	{
		res = len;
	}  
	return res;
}
int main()
{
	int arr[] = {0, 1, 2};
	//这里长度要单独拿出来计算,因为arr传入到find函数里面,会直接当成一级指针来进行处理
	//指针一般也就是一般windows上4个字节,linux上八个字节来进行处理
	int len = sizeof(arr) / sizeof(arr[0]);
	int res = find_disappear(arr, len);
	printf("缺失的数字是:%d\n", res);
	return 0;
}
时间复杂度为O(nlogn)明显与题目要求不符合,no_pass
下面是第二种思路分析

#include <cstdio>
int find_number(int *nums, int len)
{
	//正确的长度是
	int len_correct = len + 1;
	//计算正确求和值
	int sum_correct = (len_correct * (len_correct - 1)) / 2;
	int sum_wrong = 0;//非正确的求和值	
	//开始轮替,计算非正确的值,然后相减
	for (int i = 0; i < len; i++)
	{
		sum_wrong += nums[i];//因为i本身就是从0开始的,所以用i来累加求和
	}
	
	return sum_correct - sum_wrong;
}
int main()
{
	int arr[] = {0, 1, 3};
	int res = find_number(arr,3);
	printf("%d\n", res);
	return 0;
}
时间度O(n),通过
leetcode提交代码:
class Solution {
public:
    int missingNumber(std::vector<int>& nums) {
        int len_correct = nums.size() + 1;
        int sum_correct = (len_correct * (len_correct - 1)) / 2;
        int sum_wrong = 0;
        for (int i = 0; i < nums.size(); ++i) {
            sum_wrong += nums[i];
        }
        return sum_correct - sum_wrong;
    }
};
 
解决。。。。。持续更新中



















