2020/8/9 开始持续更新…
刷题,我是认真的!加油鸭~
学习方法始终调整,欢迎指正。
找最大的值,就直接和前面的值比较返回最大的不好吗?
不用非得放到vector里鸭
需要注意的是,注意边界问题!!!!!!!
比较两个值应该放在哪个位置。
如果放在else里面的话,就会出现当整个字符串都是结果时,比较代码不执行的情况,ans不更新,这样是不可以的哦~
//anyway,总算知道了vector如何求最大值鸭,虽然这道题没有用到!!!
int max = *max_element(c.begin(),c.end());
代码简单,思路清晰~
a<=sqrt(c)
比较运算符==、!=、>、<、>=、<=
long解决int的溢出问题
long 为8个字节(byte),1byte = 8bit(位)
在计算机系统中,数值一律用补码来表示。
long数据类型的符号位可以通过右移63位,即int k = (int)(c>>63);
来表示。
0111 ^ 0101 = 0010; //结果的每一位等于对应位相加模二,刚好是不带进位的加法结果。
0111 & 0101 = 0101; //结果的1表示对应位相加为2,0表示对应位相加小于二,刚好是进位标识。
最后返回的表达式可以通过结果分析可得!!!
求最大值和最小值的时候不需要排序的鸭~~~
将理论与实际相结合,本该什么样,现在什么样,多了什么, 少了什么。
为了防止溢出,可以边操作,边处理。
位运算:
由于异或运算(XOR)满足结合律,并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。
运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
int missing = nums.length;
missing ^= i ^ nums[i];
//虽然没有用到,but定义get!
vector<int> ans(n);
先执行为0的操作,然后后进位。
如果在给定元素内可以进位成功或直接返回,则return。
不行的话就需要添加一个元素 1 。
//头部添加元素1
digits.insert(digits.begin(),1);
对数字中某位进行操作可以将其放在数组里面。
也可以将其转化为字符串,操作之后,再转化为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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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;
}
数字交换时,不适用临时变量。通过第一个变量存放两个数的差值,得出第二个变量,然后反过来再得到第一个变量的值。
暴力判断。从小到大遍历,求出每个数的每一位上的数,注意 被除数不能为0的情况。
也可以转换为字符串,判断字符串的长度哦~
to_string(num)
#vector --> set
set<int> st(nums.begin(), nums.end());
#set --> vector
nums.assign(st.begin(), st.end());
注意对于变量的初始化的值。
使用三个变量分别存储当前值,前一个值,前前一个值,然后在进行运算。
设计变量可以求最大值和次大值(最大值和次大值可以相等)
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];
}
递归、循环均可实现。
递归如何用?怎么用
在O(1)时间复杂度的算法:
int addDigits(int num) {
if(num!=0&&num%9==0)
return 9;
else return num%9;
}
转换为字符串鸭~~~
string:npos是个特殊值,说明查找没有匹配
if(to_string(A) + to_string(B)).find('0') == string::npos){
...
}
这个题用到了贪心算法鸭~其实没太看出是怎么贪心的。
构思巧妙,当为‘L’时,加一;为’R’时,减一。
并不一定非要求L和R分别出现的次数呀!!!
//一种遍历字符串的新思路~
for(auto c:s){
...
}
同是贪心算法,初步理解,贪心算法是求解最优情况。
出现的问题:当while条件内为numBottles!=0的情况时,会超出时间限制
。
该步骤有些繁琐,必须对于过程有所了解。
//shift+tab 反向缩进。
while(numBottles/numExchange!=0){
temp = numBottles%numExchange;
numBottles /= numExchange;
result += numBottles;
numBottles = temp+numBottles;
}
只能分情况康康~~~
又是一个动态规划的问题鸭~~~
要保证去两地的人员相等,可假设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];
}
上下和左右分别分析即可
最后直接可返回 return x==0&&y==0;
Question:x==0&&y==0 与 x==y==0在c++中是不一样的,不知道在别的语言是否可以,python好像可以。
熟知ASCII码,A:65,Z:90;a:97,z:122;
//这样才能修改字符串的值鸭~
for(auto &c:str){
...
}
先遇到空格略过,后遇到空格停止。
在C++中 双引号表示字符串,单引号表示字符。
order by 降序 DESC 升序ASC
求奇偶也可以使用 mod(id, 2) = 1
。
多对可以相互抵消的相反数直接相加,如果是奇数,最后加上0.
异或运算有以下三个性质。