力扣刷题记录-简单题3

力扣刷题记录-简单题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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值