C++算法(5)

判断字符是否唯一

拿到这个题我首先想到的就是哈希表,第一个循环遍历字符串,将所有的字符都加进去,记录下出现的次数。第二次则是循环后找是否存在次数大于1的字符。有false没有true。

代码

cpp 复制代码
class Solution {
public:
    bool isUnique(string astr) {
        unordered_map<char,int> check;
        for(auto ch : astr){
            check[ch]++;
        }
        for(auto c : astr){
            if(check[c] > 1) return false;
        }
        return true;
    }
};

59.螺旋矩阵II

和螺旋矩阵I一样,换汤不换药,模拟思想。直接上代码了。

代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int top = 0,bottom = n - 1;
        int left = 0,right = n - 1;
        int num = 1;
        
        while(top <= bottom && left <= right)
        {
            for(int i = left;i <= right;i++)
            {
                res[top][i] = num++; 
            }
            ++top;
            for(int i = top;i <= bottom;i++)
            {
                res[i][right] = num++;
            }
            --right;
            if(top <= bottom){
                for(int i = right;i >= left;--i){
                    res[bottom][i] = num++;
                }
                --bottom;
            }
            if (left <= right) {
                for (int i = bottom; i >= top; --i) {
                    res[i][left] = num++;
                }
                ++left;
            }
        }
        return res;

    }
};

268.丢失的数字

这个题第一可以使用sort排序然后遍历找数字。

还可以利用数学思想,求和公式然后遍历找数字。

代码

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int sum = n * (n + 1) / 2;
        for(auto num : nums){
            sum -= num;
        }
        return sum;
    }
};

581.最短无序连续子数组

这个题,拿到手题目让我们找连续区间【l,r】。l一定大于l之前所有的数,r一定小于r之前所有的数。所以我们需要记录下一个当前最大数和最小数,同时还需要记录下区间的大小也就是left和right边界。

想要找到边界l和r可以分别去寻找两次循环。

从左向右找r,从右向左找l。

考虑=时也需要去更新最大值最小值。

代码

cpp 复制代码
class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int n = nums.size();
        if (n <= 1) return 0; // 边界处理:数组长度<=1时直接返回0
        int left = -1,right = -1;//左右边界
        int maxnum = nums[0],minnum = nums[n -1];//最大值最小值

        for(int i = 1;i < n;i++){
            if(nums[i] >= maxnum){//当前的值大于目前记录的最大值,更新最大值
                maxnum = nums[i];
            }else right = i;//当前的值小于记录的最大值,更新边界
        }
        

        if(right == -1) return 0;

        for(int i = n - 2;i >= 0;i--){
            if(nums[i] <= minnum){//当前的值大于目前记录的最小值,更新最小值
                minnum= nums[i];
            }else left = i;//当前的值大于记录的最小值,更新边界
        }

        return right - left + 1;
    }
};

43.字符串相乘

这个题,求乘积但不能使用转换的库。

那么可以回归一个乘积的本质又或者说是拆开乘积。

比如123 * 456就是123 * (400+50+6)

然后得到的数可以不断地进位,最后得到答案并构建结果字符串。

但这样会很麻烦,所以我们多开辟一个数组,然后先记录下当前每一位的乘积,然后再处理进位,最后构建答案。

代码

cpp 复制代码
class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        
        int n1 = num1.size(), n2 = num2.size();
        vector<int> res(n1 + n2, 0);
        
        // 模拟乘法累加(不立即处理进位)
        for (int i = n1 - 1; i >= 0; --i) {
            for (int j = n2 - 1; j >= 0; --j) {
                int mul = (num1[i] - '0') * (num2[j] - '0');
                int p1 = i + j;      // 高位(十位及以上)
                int p2 = i + j + 1;  // 低位(个位)
                
                int sum = mul + res[p2];  // 先加到低位
                res[p2] = sum % 10;
                res[p1] += sum / 10;      // 进位直接加到高位
            }
        }
        
        // 构建结果字符串,跳过前导零
        string result;
        for (int i = 0; i < n1 + n2; ++i) {
            if (!result.empty() || res[i] != 0) {  // 开始收集非零位
                result += '0' + res[i];
            }
        }
        
        return result.empty() ? "0" : result;
    }
};
相关推荐
叫我一声阿雷吧1 小时前
【信奥赛基础】动态规划:小学生也能懂的必考算法入门
算法·动态规划
jjjxxxhhh1232 小时前
RSA加密解密代码
开发语言·c++
重生之后端学习2 小时前
236. 二叉树的最近公共祖先
java·数据结构·算法·职场和发展·深度优先
就不掉头发2 小时前
回溯法----不断地尝试直到找到成功
算法
Sun_gentle2 小时前
java.lang.RuntimeException: Could not load wrapper properties from ‘C:\Users\
java·开发语言·安卓
2501_901147832 小时前
有序数组单一元素查找:从通用解法到算法极致优化——兼谈高性能计算基础思路
算法·面试·职场和发展
笨蛋不要掉眼泪2 小时前
Nacos配置中心详解:核心用法、动态刷新与经典面试题解析
java·数据库·后端
橙露2 小时前
面向对象编程思想:Java 与 Python 的封装、继承与多态对比分析
java·开发语言·python
上海合宙LuatOS2 小时前
LuatOS核心库API——【io】 io操作(扩展)
java·服务器·前端·网络·单片机·嵌入式硬件·物联网