【LeetCode】力扣刷题记录第三天

刷题第三天!废话不多说直接开始一起猛猛学!

第一题: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];
    }
};

今天到这里的结束啦~我们明天见!

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值