在掌握基础语法之后,刷题的重点会逐渐转向思维模型的积累。 本文从多个常见基础模块出发,通过经典力扣题目,系统训练:
-
位运算与 ASCII 处理
-
数学中的取余、因数与倍数
-
数组与矩阵遍历
-
数组 + 字符串的综合处理能力
一、位运算 & ASCII 码
1️⃣ LeetCode 709:转换成小写字母
题目描述 给定一个字符串 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:各位相加
题目描述 给定一个非负整数 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,返回各位数字的乘积 与和的差值。
解题思路
-
同时计算
sum和product -
每次取一位数字即可
代码实现(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 的幂
题目描述 判断一个整数 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 的幂
解题思路
-
不断除以 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:丑数
题目描述 若一个数的质因子只包含 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:重新排列数组
题目描述 给定数组 [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:转置矩阵
题目描述 将矩阵的行列互换。
解题思路
-
新矩阵行数 = 原列数
-
双层循环完成转置
代码实现
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 和两个整数:left 和 right 。
如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 '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:山脉数组的峰顶索引
给定一个长度为 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码转换、因数分解、矩阵转置等基础算法技巧。
文章采用"题目描述+解题思路+代码实现+知识点总结"的结构,重点训练基础语法之上的算法思维模型构建能力。这些题目既是算法入门的重要分水岭,也是证明编程基础扎实的有效案例,特别适合准备技术面试的初学者系统学习。