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

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

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。

30. 三个数的最大乘积

不要忘记考虑负数情况!!!!
找到最大的三个数和最小的两个数即可。可用排序也可不用。

//排序从大到小
sort(nums.begin(),nums.end());

31. 猜数字

判断两个是否相等 使用== 或者异或(异或时注意结果可能并不是0或者1)

32. 拿硬币

对于奇偶,可用count+=(coin+1)/2;

33. IP 地址无效化

当修改的内容和原有的长度不匹配时,记得修改索引值
c++ replace函数
例如:address.replace(i,1,"[.]");

34. 速算机器人

按部就班算,so easy~

35. 拥有最多糖果的孩子

求vector的最大值:int max = *max_element(candies.begin(),candies.end());
对于布尔型vector的添加可使用:res.push_back((candies[i]+extraCandies)>=max);

36. 有序数组的平方

//加上&可以改变A内元素的值,不加不可以哦~~~
for(auto &i:A)

双指针是什么神奇的存在???(用双指针暂不会,暂不研究)

37. 整数的各位积和之差

按部就班做就可。
其它方法:可以转成字符串看鸭~~~

38. 重新排列数组

遍历的同时,push_back上第i个数和第i+1个数,该时间复杂度是O(n), O(1)的有待解决呜呜呜。

39. 大的国家

SQL语句,or

40. 转置矩阵

指定二维vector的行数vector<vector<int>> res(A[0].size());
res[j].push_back(A[i][j]);不报错,res[i].push_back(A[j][i]);报错。

41. 交换工资

---- 法一:
update salary set sex = if(sex='m','f','m')
---- 法二:
update salary set sex = case sex when 'f' then 'm' else 'f' end;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值