力扣基础算法分类刷题:位运算、数学、数组与字符串详解

在掌握基础语法之后,刷题的重点会逐渐转向思维模型的积累。 本文从多个常见基础模块出发,通过经典力扣题目,系统训练:

  • 位运算与 ASCII 处理

  • 数学中的取余、因数与倍数

  • 数组与矩阵遍历

  • 数组 + 字符串的综合处理能力


一、位运算 & ASCII 码

1️⃣ LeetCode 709:转换成小写字母

709. 转换成小写字母 - 力扣(LeetCode)

题目描述 给定一个字符串 s,将其中所有大写字母转换为小写字母并返回。


解题思路一:ASCII 码转换(推荐)

  • 大写字母 'A' ~ 'Z' 的 ASCII 范围是 65 ~ 90

  • 小写字母 'a' ~ 'z' 比大写大 32

  • 手动判断并转换,避免调用库函数


代码实现(C++)

cpp 复制代码
class Solution {
public:
    string toLowerCase(string s) {
        for (char& c : s) {
            if (c >= 'A' && c <= 'Z') {
                c = c + 32;
            }
        }
        return s;
    }
};

📌 知识点总结

  • ASCII 编码差值

  • 字符与整数的隐式转换

  • 引用遍历字符串


二、数学:取余运算

2️⃣ LeetCode 258:各位相加

258. 各位相加 - 力扣(LeetCode)

题目描述 给定一个非负整数 num,不断将各位数字相加,直到结果为一位数。


解题思路(取余 + 除法)

  • % 10 取最低位

  • / 10 去掉最低位

  • 循环求和,直到 < 10


代码实现(C++)

cpp 复制代码
class Solution {
public:
    int addDigits(int num) {
        while (num >= 10) {
            int sum = 0;
            while (num > 0) {
                sum += num % 10;
                num /= 10;
            }
            num = sum;
        }
        return num;
    }
};

📌 知识点

  • 取余分解整数

  • 双层循环

  • 数学模拟问题


3️⃣ LeetCode 1281:整数的各位积和之差

1281. 整数的各位积和之差 - 力扣(LeetCode)

题目描述 给定整数 n,返回各位数字的乘积的差值。


解题思路

  • 同时计算 sumproduct

  • 每次取一位数字即可


代码实现(C++)

cpp 复制代码
class Solution {
public:
    int subtractProductAndSum(int n) {
        int sum = 0;
        int product = 1;
        while (n > 0) {
            int d = n % 10;
            sum += d;
            product *= d;
            n /= 10;
        }
        return product - sum;
    }
};

📌 知识点

  • 多变量并行更新

  • 注意乘积初始值为 1


三、数学:因数与倍数

4️⃣ LeetCode 231:2 的幂

231. 2 的幂 - 力扣(LeetCode)

题目描述 判断一个整数 n 是否是 2 的幂。


解题思路(位运算)

  • 2 的幂在二进制中只有 一个 1

  • n & (n - 1) 可以消除最低位的 1


代码实现(C++)

cpp 复制代码
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }
};

📌 知识点

  • 位运算经典技巧

  • 二进制特性


5️⃣ LeetCode 326:3 的幂

326. 3 的幂 - 力扣(LeetCode)

解题思路

  • 不断除以 3

  • 若最终等于 1,则是 3 的幂


代码实现

cpp 复制代码
class Solution {
public:
    bool isPowerOfThree(int n) {
        if (n <= 0) return false;
        while (n % 3 == 0) {
            n /= 3;
        }
        return n == 1;
    }
};

6️⃣ LeetCode 263:丑数

263. 丑数 - 力扣(LeetCode)

题目描述 若一个数的质因子只包含 2, 3, 5,则称其为丑数。


解题思路

  • 不断除以 2 / 3 / 5

  • 最终是否能被化简为 1


代码实现

cpp 复制代码
class Solution {
public:
    bool isUgly(int n) {
        if (n <= 0) return false;
        for (int x : {2, 3, 5}) {
            while (n % x == 0) {
                n /= x;
            }
        }
        return n == 1;
    }
};

📌 知识点

  • 因数分解

  • 循环消除因子


四、数组 & 矩阵

7️⃣ LeetCode 1470:重新排列数组

1470. 重新排列数组 - 力扣(LeetCode)

题目描述 给定数组 [x1,x2,...,xn,y1,y2,...,yn],重排为 [x1,y1,x2,y2,...,xn,yn]


解题思路

  • 使用新数组

  • 双指针交替填充


代码实现

cpp 复制代码
class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
        vector<int> res;
        for (int i = 0; i < n; ++i) {
            res.push_back(nums[i]);
            res.push_back(nums[i + n]);
        }
        return res;
    }
};

8️⃣ LeetCode 867:转置矩阵

867. 转置矩阵 - 力扣(LeetCode)

题目描述 将矩阵的行列互换。


解题思路

  • 新矩阵行数 = 原列数

  • 双层循环完成转置


代码实现

cpp 复制代码
class Solution {
public:
    vector<vector<int>> transpose(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int>> res(n, vector<int>(m));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                res[j][i] = matrix[i][j];
            }
        }
        return res;
    }
};

五、数组 & 字符串

9️⃣ LeetCode 1422:分割字符串的最大得分

1422. 分割字符串的最大得分 - 力扣(LeetCode)

给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 子字符串和 子字符串)所能获得的最大得分。

「分割字符串的得分」为 子字符串中 0 的数量加上 子字符串中 1 的数量。

解题思路

  • 左边统计 0

  • 右边统计 1

  • 枚举分割点


代码实现

cpp 复制代码
class Solution {
public:
    int maxScore(string s) {
        int ones = count(s.begin(), s.end(), '1');
        int zeros = 0, res = 0;
        for (int i = 0; i < s.size() - 1; ++i) {
            if (s[i] == '0') zeros++;
            else ones--;
            res = max(res, zeros + ones);
        }
        return res;
    }
};

🔟 LeetCode 2586:统计范围内的元音字符串数

2586. 统计范围内的元音字符串数 - 力扣(LeetCode)

给你一个下标从 0 开始的字符串数组 words 和两个整数:leftright

如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 'a''e''i''o''u'

返回words[i] 是元音字符串的数目,其中i 在闭区间 [left, right] 内。

cpp 复制代码
class Solution {
public:
    bool isVowel(char c) {
        return string("aeiou").find(c) != string::npos;
    }

    int vowelStrings(vector<string>& words, int left, int right) {
        int cnt = 0;
        for (int i = left; i <= right; ++i) {
            if (isVowel(words[i].front()) && isVowel(words[i].back())) {
                cnt++;
            }
        }
        return cnt;
    }
};

1️⃣1️⃣ LeetCode 852:山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。

返回峰值元素的下标。

你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

cpp 复制代码
class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        for (int i = 1; i < arr.size() - 1; ++i) {
            if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) {
                return i;
            }
        }
        return -1;
    }
};

总结

这一组题目系统覆盖了:

  • 位运算与字符处理

  • 数学基础建模能力

  • 数组与矩阵遍历

  • 字符串逻辑判断

👉 非常适合作为:

  • 力扣入门到初级的分水岭总结

  • 简历中「算法基础扎实」的证明

本文系统梳理了力扣入门级算法题目的解题思路,涵盖位运算、数学运算、数组处理和字符串操作四大核心模块。

通过分析709题(大小写转换)、258题(数字各位相加)、231题(2的幂判断)等12道经典题目,详细讲解了ASCII码转换、因数分解、矩阵转置等基础算法技巧。

文章采用&quot;题目描述+解题思路+代码实现+知识点总结&quot;的结构,重点训练基础语法之上的算法思维模型构建能力。这些题目既是算法入门的重要分水岭,也是证明编程基础扎实的有效案例,特别适合准备技术面试的初学者系统学习。

相关推荐
ValhallaCoder1 小时前
hot100-图论
数据结构·python·算法·图论
熬了夜的程序员1 小时前
【LeetCode】118. 杨辉三角
linux·算法·leetcode
智算菩萨1 小时前
规模定律的边际递减与后训练时代的理论重构
人工智能·算法
kanhao1001 小时前
电平交叉采样 (Level-Crossing Sampling)
算法·fpga开发·fpga
Hcoco_me1 小时前
图像分割:目标检测、语义分割和实例分割
人工智能·深度学习·算法·目标检测·计算机视觉·目标跟踪
iAkuya1 小时前
(leetcode)力扣100 69有效的括号(栈)
算法·leetcode·职场和发展
We་ct1 小时前
LeetCode 21. 合并两个有序链表:两种经典解法详解
前端·算法·leetcode·链表·typescript
Epiphany.5562 小时前
蓝桥杯2024年第十五届决赛真题-套手镯
c++·算法·蓝桥杯
Σίσυφος19002 小时前
E = Kᵀ F K 的数学原理
算法