刷题第三天!废话不多说直接开始一起猛猛学!
第一题:LeetCode1427
题目:字符串的左右移
给定一个包含小写英文字母的字符串 s 以及一个矩阵 shift,其中 shift[i] = [direction, amount]:
direction 可以为 0 (表示左移)或 1 (表示右移)。
amount 表示 s 左右移的位数。
左移 1 位表示移除 s 的第一个字符,并将该字符插入到 s 的结尾。
类似地,右移 1 位表示移除 s 的最后一个字符,并将该字符插入到 s 的开头。
对这个字符串进行所有操作后,返回最终结果。
解题思路:
遍历shift
向量,根据每个操作的类型(向右移动或向左移动),更新计数器count
的值。根据字符串s
的长度,计算实际的移动距离。如果计数器为负数,说明需要向左移动,将计数器的值加上字符串长度后取模;如果计数器为正数,说明需要向右移动,直接将计数器的值取模。根据实际移动距离,将字符串s
分为两部分,并将它们拼接起来形成结果字符串。最后返回结果字符串。
class Solution {
public:
string stringShift(string s, vector<vector<int>>& shift){
int count = 0;//初始化计数器为0
for(auto iter : shift){
if(iter[0] == 1)//当前操作向右移动,移动距离累加到计数器上
count += iter[1];
else
count -= iter[1];//当前操作向左移动,将移动距离从计数器中减去
}
int sz = s.size();//获取字符串长度
if(count < 0)
count = (count % sz + sz);//计数器为负数时说明需要向右移动,计算实际移动距离
else if(count > 0 )
count = (count % sz);//计数器为正时需要向左移动,计算实际移动距离
string res;//创建空的字符结果串
res = s.substr(sz - count, sz) + s.substr(0, sz - count);//拼接两部分的字符串
return res;
}
};
第二题:LeetCode728
题目:
解题思路:
遍历给定范围内的所有整数,对于每个整数,将其转换为字符串,然后逐个字符检查。如果字符是'0',则该数字不是自除数;否则,将字符转换为整数,检查当前数字是否能被该整数整除。如果不能整除,说明该数字不是自除数。最后,将所有自除数添加到结果向量中并返回。
class Solution {
public:
vector<int> selfDividingNumbers(int left, int right) {
vector<int>res;//创建一个向量用于存储自除数
for(int i=left;i<=right;i++)//遍历从left到right的所有整数
{
bool fg=true;//初始化一个布尔变量,用于标记当前数是否为自除数
string s=to_string(i);// 将当前数字转换为字符串
for(auto x:s){// 遍历当前数字的每个字符
if(x=='0'){// 如果字符是'0',则该数字不是自除数
fg=false;
break;
}
int X=x-'0';//将字符转换为对应的整数
if(i%X!=0){// 如果当前数字不能被X整除,说明它不是自除数
fg=false;
}
}
if(fg)
res.push_back(i);//如果当前数字是自除数,将其添加到结果向量中
}
return res;
}
};
第三题: LeetCode2119
解题思路:
题目要求我们判断一个整数在经过两次翻转后是否与原数相同。这里的翻转是指将整数的各位数字顺序颠倒。例如,对于整数1234,第一次翻转后得到4321,第二次翻转后得到1234,所以两次翻转后的结果与原数相同。这样我们就得出一个简单的结论:如果一个整数的最后一位不是0,那么它在任何情况下都不会与原数相同(因为翻转后最后一位会变成第一位)。同时,如果整数本身就是0,那么无论怎么翻转,结果都是0,因此也满足条件。所以,我们的代码只需要检查整数的最后一位是否不为0,或者整数是否为0。如果满足这两个条件之一,那么返回true,表示经过两次翻转后与原数相同;否则返回false。
class Solution {
public:
bool isSameAfterReversals(int num) {
// 检查num的最后一位是否不为0,或者num是否为0
return num % 10 != 0 or num == 0;
}
};
第四题:LeetCode509
解题思路:
首先判断输入的整数N是否小于等于1,如果是,则直接返回N。因为斐波那契数列的前两项是0和1。创建一个大小为N+1的数组dp,用于保存斐波那契数列中每个数的值。初始化数组的前两个元素为0和1,即dp[0] = 0, dp[1] = 1。使用一个for循环,从i=2开始遍历到N,计算斐波那契数列中的第i个数。在循环中,将当前位置的值设置为前两个数的和,即dp[i] = dp[i - 1] + dp[i - 2]。循环结束后,返回数组dp中第N个元素的值。
class Solution {
public:
int fib(int N) {
// 如果N小于等于1,则直接返回N
if (N <= 1) return N;
// 创建一个大小为N+1的数组,用于保存斐波那契数列中每个数的值
vector<int> dp(N + 1);
// 初始化数组的前两个元素为0和1
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= N; i++) {
// 当前位置的值等于前两个数的和
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[N];
}
};
今天到这里的结束啦~我们明天见!