判断字符是否唯一

拿到这个题我首先想到的就是哈希表,第一个循环遍历字符串,将所有的字符都加进去,记录下出现的次数。第二次则是循环后找是否存在次数大于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;
}
};