题目
/**
* 散装翻译
* 题目:
* 您将获得两个非空链表,表示两个非负整数。
* 数字以相反的顺序存储,每个节点包含一个数字。
* 添加两个数字并将其作为链接列表返回。
* 您可以假设这两个数字不包含任何前导零,除了数字0本身。
*
* Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
* Output: 7 -> 0 -> 8
* Explanation: 342 + 465 = 807.
*
*/
这个我看了题解,顺便带上网址
https://leetcode.com/problemset/all/
https://leetcode-cn.com/problemset/all/ 中文
这题 对于俺这种没基础的根本看不懂
反正 Android 可以 反转 然后加减
后来发现第7题正好就是反转
为了便于解释,我们假设 rev\text{rev}rev 是正数。
- 如果 temp=rev⋅10+poptemp = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 导致溢出,那么一定有 rev≥INTMAX10\text{rev} \geq \frac{INTMAX}{10}rev≥10INTMAX。
- 如果 rev>INTMAX10\text{rev} > \frac{INTMAX}{10}rev>10INTMAX,那么 temp=rev⋅10+poptemp = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 一定会溢出。
- 如果 rev==INTMAX10\text{rev} == \frac{INTMAX}{10}rev==10INTMAX,那么只要 pop>7\text{pop} > 7pop>7,temp=rev⋅10+poptemp = \text{rev} \cdot 10 + \text{pop}temp=rev⋅10+pop 就会溢出。
当 rev\text{rev}rev 为负时可以应用类似的逻辑。
public int reverseInt(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7))
return 0;
if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8))
return 0;
rev = rev * 10 + pop;
}
return rev;
}
这个是大佬们写的,感觉很牛叉 ,还判断了 泄漏啥的
思路 我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。 算法 反转整数的方法可以与反转字符串进行类比。 我们想重复“弹出” x 的最后一位数字,并将它“推入”到 \text{rev} 的后面。最后,\text{rev} 将与 x 相反。 要在没有辅助堆栈 / 数
Android
Method2
/**
*
* 这个方法 如果是负数的话 就不行了
* 可以把他先Math.abs() 先判断正负,>0 <0留个标记 ,取绝对值 然后再给他加上正负号*1 *-1
*
*/
StringBuilder reverse = new StringBuilder("546454530").reverse();
int i = Integer.parseInt(reverse.toString());
System.out.println(" reverse : " + i);