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. 只出现一次的数字
- 30. 三个数的最大乘积
- 31. 猜数字
- 32. 拿硬币
- 33. IP 地址无效化
- 34. 速算机器人
- 35. 拥有最多糖果的孩子
- 36. 有序数组的平方
- 37. 整数的各位积和之差
- 38. 重新排列数组
- 39. 大的国家
- 40. 转置矩阵
- 41. 交换工资
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. 只出现一次的数字
异或运算有以下三个性质。
- 任何数和 00 做异或运算,结果仍然是原来的数,即 a⊕0=a。
- 任何数和其自身做异或运算,结果是 0,即a⊕a=0。
- 异或运算满足交换律和结合律,即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;