之前写了一篇重点是讲理论,今天重点在于对于题目的分析
题目难度不分先后,有题目来源会直接给出链接或者位置
第一题:消失的数字
题目来源: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]) {//这里直接缺少的就是ires = 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;}
};
java代码的实现
java小知识点补讲:
1.一个类中的静态方法在new一个非静态成员成员内部类的时候,成员内部类必须是static的
也就是说下面这种写法是错误的
应该换成下面这种写法
如果你实在想内部类不设置为static的,那么,也可以按照如下方式来做
说一下原因:main是一个静态方法,也就是说它是先对对象而存在的,如果Solution是一个依赖于Lc对象才存在的对象,那么如果直接new Solution肯定是不行的,因为Lc这个类都没有被加载到内存里面来,也就是说,这个类在内存里面是没有空间的,Lc没有空间,那么它的内部类 Solution凭什么会有空间。另外说一句,类加载到方法区是不一定会去创建这个类的实例的,他只会把类的相关信息封存起来放到一个Class<相关类>的一个字节码对象里面
说一下上面的类加载到方法区的机制
下面看具体的代码:
public class Lc {static class Solution {public int missingNumber(int[] nums) {//先求出正确的和int correct_len = nums.length + 1;int correct_sum = correct_len * (correct_len - 1) / 2;int wrong_sum = 0;//保留不正确的和for (int i = 0; i < nums.length; i++) {wrong_sum += nums[i];}return correct_sum - wrong_sum;}}public static void main(String []args) {int[] nums = {3, 0, 1};Solution solution = new Solution();int res = solution.missingNumber(nums);System.out.println(res);}
}
上面代码自行提交,具体逻辑分析看上面c++代码分析,
持续更新中。。。。。。