给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号:
最高有效位 上的数字分配到 正 号。
剩余每位上数字的符号都与其相邻数字相反。
返回所有数字及其对应符号的和。
输入:n = 521 输出:4 解释:(+5) + (-2) + (+1) = 4
思路1:可以分为偶数个数或者奇数个数,可以按照每一次%10和/10操作一次取出最后一位和删除最后一位,用flag记录符号位到最高位的时候如果符号为负则整体sum变负,如果符号为正则返回sum
因为每次置反 所以最后一次会出现 如果奇数整数则符号位为负,反之同理。每次循环结束的符号位就是下次的符号位,所以要置反求现在的符号位。
class Solution {
public:
int alternateDigitSum(int n) {
int res = 0, sign = 1;
while (n > 0) {
res += n % 10 * sign;
sign = -sign;
n /= 10;
}
return -sign * res;
}
};
思路2:根据取对数找到这是几位整数,每次取出最后一位和删除最后一位,将num-- 如果num为偶数则此时符号位为负,如果为奇数则符号位为正
class Solution {
public:
int alternateDigitSum(int n) {
int flag=0;
int num=log10(n)+1;
long long sum=0;
while(n){
if(num%2==0){
sum-=n%10;
}
else{
sum+=n%10;
}
n=n/10;
num--;
}
return sum;
}
};
思路三:转化为字符串然后每步模拟
class Solution {
public int alternateDigitSum(int n) {
String s = String.valueOf(n);
int len = s.length();
int ans = 0;
boolean flag = true;
for (int i = 0; i < len; i++){
ans += flag ? Integer.valueOf(s.charAt(i) - '0') : -Integer.valueOf(s.charAt(i) - '0');
flag ^= true;
}
return ans;
}
}