【算法】Alternating Digit Sum 交替数字和

文章目录

  • Alternating Digit Sum 交替数字和
    • 问题描述:
    • 分析
    • 代码
      • 改进
    • Tag

Alternating Digit Sum 交替数字和

问题描述:

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

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

1 < = n < = 1 0 9 1 <= n<= 10^9 1<=n<=109

分析

这是一次contest的Q1。

问题很简单,就是把n 拆成单个数字,间隔的进行加减累加。

而且由于符合是以最高位的是正号,开始交替变换的。
所以将n转换成为字符串,然后交替处理是比较常规的。

时间复杂度O(L),空间复杂度O(L),L为n的位数

今天看了一下,其实还有改进的空间,即空间 O ( 1 ) O(1) O(1)的方法。
可以从最低位逐个拆,但是由于整体符号会受到最高位的影响,可以先指定最低位是 sign =1,即正号,

  • 如果n有偶数位,那么处理完最高位,sign一定会变成1,所以需要 补乘-1.
  • 如果n有奇数位,处理完最高位,sign一定会变成-1,不用处理。

从数据规模上,L最大不过9,所以空间的改进基本也看不出太大影响。

代码

public int alternateDigitSum(int n) {
        String s = String.valueOf(n);
        int len = s.length();
        int f = len%2==0?-1:1;
        int x = n,ans =0;
        while(x>0){
            int m = x%10;
            ans += m*f;
            f *=-1;
            x /=10;
        }
        return ans;
    }

时间复杂度 O ( L ) O(L) O(L)

空间复杂度 O ( L ) O(L) O(L)

改进

public int alternateDigitSum(int n) {
        int sign = 1 ,x = n,ans =0;
        while(x>0){
            ans += sign*(x%10);
            x/=10;
            sign = -sign; 
        }
        return sign==1? -ans:ans;
    }

时间复杂度 O ( L ) O(L) O(L)

空间复杂度 O ( 1 ) O(1) O(1)

Tag

Math

你可能感兴趣的:(数据结构与算法,算法,数据结构)