(63)交替数字和(64)找到最高海拔


1. 每日一言

柳下系船犹未稳,能几日,又中秋。
出自 宋⋅ 刘过 的《唐多令》


2. 题目(63)交替数字和

题目链接:交替数字和

给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号:

最高有效位 上的数字分配到 正 号。
剩余每位上数字的符号都与其相邻数字相反。
返回所有数字及其对应符号的和。

  • 示例 1:
    输入:n = 521
    输出:4
    解释:(+5) + (-2) + (+1) = 4

  • 示例 2:
    输入:n = 111
    输出:1
    解释:(+1) + (-1) + (+1) = 1

  • 示例 3:
    输入:n = 886996
    输出:0
    解释:(+8) + (-8) + (+6) + (-9) + (+9) + (-6) = 0

提示:
1 <= n <= 109


3. 解题思路

  1. 首先,先通过循环计算出输入整数 n 的位数,这里使用了一个临时变量 tmp 来存储 n 的值,然后进行除以10的操作,每除一次,就将位数 sum 加一。这一步骤是为了后续计算偶数位数和奇数位数的数字和作准备。

  2. 接下来是对输入整数按照位数的奇偶进行不同操作的判断:

  3. 如果位数 sum 是偶数,那么就需要按照奇偶位交替地给数字添加正负号,并计算交替数字和,也就是偶数位上的数字带负号,奇数位上的数字带正号,然后将它们相加得到最终结果。

  4. 如果位数 sum 是奇数,同样需要按照奇偶位交替地给数字添加正负号,并计算交替数字和,也就是奇数位上的数字带正号,偶数位上的数字带负号,然后将它们相加得到最终结果。

  5. 最后,返回计算得到的交替数字和作为函数的返回值。

以上的太麻烦了,换一个

  1. 首先,定义变量 sum 用于存储最终的交替数字和的结果,定义变量 f,并初始化为 1,用来控制每一位数字的正负符号。

  2. 接下来通过循环对输入整数 n 进行处理,每次取 n 的个位数字(n%10),然后乘以当前的符号 f,将这个结果累加到 sum 中。然后,通过将 n 除以 10,以便在下一次循环中处理下一位数字,并且更新符号 f 为 -f,以实现交替的符号添加。

  3. 最后,通过返回 -f 乘以 sum,来确保最终的结果是带上正确的数字符号的。

4. 代码

int alternateDigitSum(int n) {
    int sum = 0;//统计n有几位

    int tmp = n;//临时存储n的值

    while(tmp) {
        tmp/=10;
        sum++;
    }

    tmp = n;
    if(sum%2 == 0)//偶数
    {
        sum = 0;
        int f = -1;//控制数字符号
        while(tmp) {
            sum += (tmp%10)*f;
            tmp /= 10;
            f = -f;
        }
    }else {
        sum = 0;
        int f = 1;//控制数字符号
        while(tmp) {
            sum += (tmp%10)*f;
            tmp /= 10;
            f = -f;
        }
    }
    return sum;
}

改进一下

int alternateDigitSum(int n) {
    int sum = 0;//统计n有几位
    int f = 1;

    while(n) {
        sum+=(n%10)*f;
        n/=10;
        f=-f;
    }
    return sum*(-f);
}

最后的return语句有点绕,详细解释一下
举个例子

// 5 2 1 
// 1 -2 +5 = 4(此时 f = -1)
// 4 * (- f) = 4 值不变(而且这个值就是我们想要的)

// 1 2
// 2 - 1 = 1(此时 f = 1)
// 1 * (- f) = -1(此时这个值是我们想要的)

总结一下:标志位f刚开始是1。如果n是奇数位数字,最后累加的结果是正确的,但是f最后是-1,所以sum*(-f)还是res,结果不变;如果n是偶数位数字,最后的结果sum是真正的答案的相反数,而f最后是1,所以sum*(-f)刚好把计算结果取相反数,能得到正确的答案。

5. 题目(64)找到最高海拔

题目链接:找到最高海拔

有一个自行车手打算进行一场公路骑行,这条路线总共由 n + 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。

给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i + 1 的 净海拔高度差(0 <= i < n)。请你返回 最高点的海拔 。

  • 示例 1:
    输入:gain = [-5,1,5,0,-7]
    输出:1
    解释:海拔高度依次为 [0,-5,-4,1,1,-6] 。最高海拔为 1 。

  • 示例 2:
    输入:gain = [-4,-3,-2,-1,4,3,2]
    输出:0
    解释:海拔高度依次为 [0,-4,-7,-9,-10,-6,-3,-1] 。最高海拔为 0 。

提示:
n == gain.length
1 <= n <= 100
-100 <= gain[i] <= 100


6. 解题思路

读懂题目就会发现他是如此的简单

  1. 首先定义两个变量 sum 和 max,分别用于记录当前的海拔高度变化总和以及历史最大海拔高度。

  2. 接下来通过一个 for 循环遍历整个 gain 数组,在每次迭代中,累加当前的海拔变化 gain[i] 到 sum 变量中,并且判断是否出现了更高的海拔高度(即 sum 是否大于 max),如果是则更新 max 为当前的海拔高度。

  3. 最终,返回 max 变量,即为数组 gain 中的最大海拔高度。

7. 代码

int largestAltitude(int* gain, int gainSize) {
    int sum = 0;
    int max = 0;
    for(int i = 0; i < gainSize; i++) {
        sum+=gain[i];
        if(max < sum) {
            max = sum;
        }
    }
    return max;
}

8. 结语

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月临水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值