力扣刷题记录-简单题11~15(基础解法)
11.【058最后一个单词的长度】
(1)题目:
(2)思考:依次遍历法
。要求最后一个单词的长度,首先把空格给排除掉,从最后一个字符遍历,遇到空格就往下遍历直到遇到不是空格的字符,然后再接着之前的遍历计数,直到再次遇到空格为止,就是最后一个单词的长度。
(3)代码:
int lengthOfLastWord(char* s) {
int n=strlen(s);
int k=0;//最后一个单词的长度
int i=n-1;
while(i>=0&&s[i]==' ')//跳过空格的长度
{
i--;
}
while(i>=0&&s[i]!=' ')
{
k++;
i--;
}
return k;
}
12.【066加一】
(1)题目:
(2)思考:分为两种情况,一种是数组长度不改变
,另一种是数组长度加一
。先讨论第一种情况,可能数组最后一位不是9,也可能数组元素不全是9,这样的话只需要让最后一位变成0然后再继续处理前一位就行了,当碰到不是9的元素,就在这一位加一然后返回这个修改之后的数组。第二种情况数组长度加一,只能是数组元素都是9,这样的话就把数组的长度加一,并且让数组第一位为1其他位为0即可。
(3)代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {
for(int i=digitsSize-1;i>=0;i--)
{
if(digits[i]!=9)//只要遇到有一位不是9,那么就能在当前位加一并且返回
{
digits[i]++;
*returnSize=digitsSize;
return digits;
}
else{
digits[i]=0;
}
}
//只有当所有位都是9才会触发下面的代码,数组长度加一然后第一位是1其他位都是0;
*returnSize=digitsSize+1;
int* result = (int*)malloc(*returnSize * sizeof(int));
result[0]=1;
for (int i = 1; i < *returnSize; i++) {
result[i] = 0; // 其余位为0
}
return result;
}
13.【067二进制求和】*
(1)题目:
(2)思考:二进制求和,正常计算需要右边对齐然后从左往右依次计算,但是不方便用for循环遍历,于是我们可以把它翻转
,这样就可以从左往右遍历了。在相加的时候注意字符与数字的区别,不能让字符直接相加。
(3)代码:
//翻转相加求和再翻转
void Reverse(char *str)//翻转字符串的函数
{
int n=strlen(str);//字符串的长度
for(int i=0;i<n/2;i++){//依次让最左边与最右边的元素调换位置
char tmp=str[i];
str[i]=str[n-i-1];
str[n-i-1]=tmp;
}
}
char* addBinary(char* a, char* b) {
Reverse(a),Reverse(b);
int len_a=strlen(a);
int len_b=strlen(b);
int n=fmax(len_a,len_b);
int carry=0;//初始化进位标志
char *ans=(char*)malloc(sizeof(char)*(n+2));
for (int i = 0; i < n; i++) {
int n1 = i < len_a ? (a[i] == '1') : 0; // 直接判断字符是否为 '1'
int n2 = i < len_b ? (b[i] == '1') : 0; // 直接判断字符是否为 '1'
ans[i] = (n1 + n2 + carry) % 2 ? '1' : '0'; // 根据结果直接赋值字符
carry = (n1 + n2 + carry) / 2;
}
if(carry!=0)
ans[n++]='1';
ans[n]='\0';
Reverse(ans);
return ans;
}
14.【069x的平方根】
(1)题目:
(2)思考:方法一使用了牛顿迭代法
来求平方根。方法二使用了二分查找法
来求平方根。
(3)代码:
//方法一
int mySqrt(int x) {
long a = x;
while (a * a > x) {
a = (a + x / a) / 2;
}
return (int) a;
}
//方法二
int mySqrt(int x) {
if (x == 0 || x == 1) {
return x; // 特殊情况直接返回
}
long left = 1, right = x;
while (left <= right) {
long mid = left + (right - left) / 2; // 防止溢出
if (mid * mid == x) {
return (int)mid; // 找到精确平方根
} else if (mid * mid < x) {
left = mid + 1; // 平方小于x,向右半边搜索
} else {
right = mid - 1; // 平方大于x,向左半边搜索
}
}
return (int)right; // 返回不超过x的最大整数平方根
}
15.【070爬楼梯】
(1)题目:
(2)思考:运用递归
的方法求解。到达第i阶楼梯可能的情况有两种,一种是到达第i-1阶,另一种是到达i-2阶,所以到达第i阶楼梯的方法包括到达第i-1阶的方法加上到达第i-2阶的方法。
(3)代码:
int climbStairs(int n) {
if (n == 1) return 1;
int dp[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}