力扣刷题的一些些个注意点(持续更新)

2020/8/9 开始持续更新…
刷题,我是认真的!加油鸭~
学习方法始终调整,欢迎指正。

这里写目录标题

  • 1. 最长连续递增序列
  • 2. 平方数之和
  • 3. 最大数值
  • 4. 最小差值 I
  • 5. 缺失数字
  • 6. 将每个元素替换为右侧最大元素
  • 7. 加一
  • 8. 6 和 9 组成的最大数字
  • 9. 计数质数
  • 10. 交换数字
  • 11. 自除数
  • 12. 统计位数为偶数的数字
  • 13. 第三大的数
  • 14. 数组异或操作
  • 15. 斐波那契数列
  • 16. 数组中两元素的最大乘积
  • 17. 各位相加
  • 18. 将整数转换为两个无零整数的和
  • 19. 分割平衡字符串
  • 20. 换酒问题
  • 21. 柠檬水找零
  • 22. 两地调度
  • 23. 机器人能否返回原点
  • 24. 转换成小写字母
  • 25. 最后一个单词的长度
  • 26. 替换空格
  • 27. 有趣的电影
  • 28. 和为零的N个唯一整数
  • 29. 只出现一次的数字

1. 最长连续递增序列

找最大的值,就直接和前面的值比较返回最大的不好吗?
不用非得放到vector里鸭
需要注意的是,注意边界问题!!!!!!!
比较两个值应该放在哪个位置。
如果放在else里面的话,就会出现当整个字符串都是结果时,比较代码不执行的情况,ans不更新,这样是不可以的哦~

//anyway,总算知道了vector如何求最大值鸭,虽然这道题没有用到!!!
int max =  *max_element(c.begin(),c.end());        

2. 平方数之和

代码简单,思路清晰~
a<=sqrt(c)

3. 最大数值

比较运算符==、!=、>、<、>=、<=
long解决int的溢出问题
long 为8个字节(byte),1byte = 8bit(位)
在计算机系统中,数值一律用补码来表示。
long数据类型的符号位可以通过右移63位,即int k = (int)(c>>63);来表示。

0111 ^ 0101 = 0010; //结果的每一位等于对应位相加模二,刚好是不带进位的加法结果。
0111 & 0101 = 0101; //结果的1表示对应位相加为2,0表示对应位相加小于二,刚好是进位标识。

最后返回的表达式可以通过结果分析可得!!!

4. 最小差值 I

求最大值和最小值的时候不需要排序的鸭~~~

5. 缺失数字

将理论与实际相结合,本该什么样,现在什么样,多了什么, 少了什么。
为了防止溢出,可以边操作,边处理。

位运算:

由于异或运算(XOR)满足结合律,并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。

运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

int missing = nums.length;
missing ^= i ^ nums[i];

6. 将每个元素替换为右侧最大元素

//虽然没有用到,but定义get!
vector<int> ans(n);

7. 加一

先执行为0的操作,然后后进位。
如果在给定元素内可以进位成功或直接返回,则return。
不行的话就需要添加一个元素 1 。

//头部添加元素1
digits.insert(digits.begin(),1);

8. 6 和 9 组成的最大数字

对数字中某位进行操作可以将其放在数组里面。

也可以将其转化为字符串,操作之后,再转化为int型。

atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char类型的,而stoi()的参数是const string,不需要转化为 const char*;

class Solution {
     
public:
    int maximum69Number(int num) {
     
        string s = to_string(num);
        for (char& ch: s) {
     
            if (ch == '6') {
     
                ch = '9';
                break;
            }
        }
        return stoi(s);
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/maximum-69-number/solution/6-he-9-zu-cheng-de-zui-da-shu-zi-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

9. 计数质数

int IsPrimeNumber(int n)
    {
     
        if (n==2)
        {
     
            return 1;
        }
    
        if (n%2==0)
        {
     
            return 0;
        }
    
        int sqrtn=(int)sqrt((double)n);
    
        for (int i=3;i<=sqrtn;i+=2)
        {
     
            if (n%i==0)
            {
     
                return 0;
            }
        }
        return 1;
    }

10. 交换数字

数字交换时,不适用临时变量。通过第一个变量存放两个数的差值,得出第二个变量,然后反过来再得到第一个变量的值。

11. 自除数

暴力判断。从小到大遍历,求出每个数的每一位上的数,注意 被除数不能为0的情况。

12. 统计位数为偶数的数字

也可以转换为字符串,判断字符串的长度哦~
to_string(num)

13. 第三大的数

#vector --> set
set<int> st(nums.begin(), nums.end());
#set --> vector
nums.assign(st.begin(), st.end());

14. 数组异或操作

注意对于变量的初始化的值。

15. 斐波那契数列

使用三个变量分别存储当前值,前一个值,前前一个值,然后在进行运算。

16. 数组中两元素的最大乘积

设计变量可以求最大值和次大值(最大值和次大值可以相等)

int max = nums[0];
int max_2 = 0;
for(int i=1;i<nums.size();i++){
     
    if(nums[i]>=max){
     
        max_2 = max;
        max = nums[i];
    }
    else if(nums[i]<max&&nums[i]>max_2)
        max_2 = nums[i];
}

17. 各位相加

递归、循环均可实现。

递归如何用?怎么用

在O(1)时间复杂度的算法:

int addDigits(int num) {
     
        if(num!=0&&num%9==0)
            return 9;
        else return num%9;
    }

18. 将整数转换为两个无零整数的和

转换为字符串鸭~~~
string:npos是个特殊值,说明查找没有匹配

if(to_string(A) + to_string(B)).find('0') == string::npos){
     
	...
}

19. 分割平衡字符串

这个题用到了贪心算法鸭~其实没太看出是怎么贪心的。
构思巧妙,当为‘L’时,加一;为’R’时,减一。
并不一定非要求L和R分别出现的次数呀!!!

//一种遍历字符串的新思路~
for(auto c:s){
     
	...
}

20. 换酒问题

同是贪心算法,初步理解,贪心算法是求解最优情况。
出现的问题:当while条件内为numBottles!=0的情况时,会超出时间限制
该步骤有些繁琐,必须对于过程有所了解。

//shift+tab 反向缩进。
while(numBottles/numExchange!=0){
     
	temp = numBottles%numExchange;
	numBottles /= numExchange;
	result += numBottles;
	numBottles = temp+numBottles;
}

21. 柠檬水找零

只能分情况康康~~~

22. 两地调度

又是一个动态规划的问题鸭~~~
要保证去两地的人员相等,可假设2N都进入B地,然后N个人在分配到A地,选择的N个人应该是price_A-price_B较小的两个!
法一:可以将给定vector按照price_A-price_B进行排序,前N去B,后N去A;
法二:或者不一定非要知道price_A-price_B对应的人是多少,都去B,加上前N个price_A-price_B。

//法一:按照price_A-price_B对vector进行排序。
sort(begin(costs), end(costs),
	[](const vector<int> &o1, const vector<int> &o2) {
     
		return (o1[0] - o1[1] < o2[0] - o2[1]);
});
for(int i=0;i<N;i++){
     
	//不用两次for循环了哦
	cost = cost + costs[i][0] + costs[i+N][1];
}
//法二
for(int i=0;i<2*N;i++){
     
	cost += costs[i][1];
	if(i<N)
	  cost += diff[i];
}

23. 机器人能否返回原点

上下和左右分别分析即可
最后直接可返回 return x==0&&y==0;
Question:x==0&&y==0 与 x==y==0在c++中是不一样的,不知道在别的语言是否可以,python好像可以。

24. 转换成小写字母

熟知ASCII码,A:65,Z:90;a:97,z:122;

//这样才能修改字符串的值鸭~
for(auto &c:str){
     
	...
}

25. 最后一个单词的长度

先遇到空格略过,后遇到空格停止。

26. 替换空格

在C++中 双引号表示字符串,单引号表示字符。

27. 有趣的电影

order by 降序 DESC 升序ASC
求奇偶也可以使用 mod(id, 2) = 1

28. 和为零的N个唯一整数

多对可以相互抵消的相反数直接相加,如果是奇数,最后加上0.

29. 只出现一次的数字

异或运算有以下三个性质。

  1. 任何数和 00 做异或运算,结果仍然是原来的数,即 a⊕0=a。
  2. 任何数和其自身做异或运算,结果是 0,即a⊕a=0。
  3. 异或运算满足交换律和结合律,即a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

你可能感兴趣的:(力扣刷题)