leetcode
leetcode 1851 ~ 1900
反转两次的数字

反转两次的数字

难度:

标签:

题目描述

代码结果

运行时间: 22 ms, 内存: 16.1 MB


/*
 * The goal is to check if reversing an integer twice results in the original number using Java Streams.
 * 1. Convert the integer to a string and reverse it using a stream.
 * 2. Convert the reversed string back to an integer and repeat the process.
 * 3. Compare the final result with the original number.
 */

import java.util.stream.Collectors;

public class Solution {
    public boolean isSameAfterReversals(int num) {
        // First reversal
        int reversed1 = reverse(num);
        // Second reversal
        int reversed2 = reverse(reversed1);
        // Check if the double-reversed number is the same as the original
        return num == reversed2;
    }

    private int reverse(int num) {
        String reversedString = new StringBuilder(String.valueOf(num)).reverse().toString();
        return Integer.parseInt(reversedString);
    }
}

解释

方法:

题目要求判断一个数字反转两次后是否与原数字相同。首先,任何数字反转两次理论上应该回到原始状态。但特殊情况是,如果一个数字的末尾有0,第一次反转后会丢失这些0(不保留前导零),导致第二次反转后的数字不等于原始数字。因此,只需检查数字是否为0或其末尾是否有0。如果数字是0,它经过两次反转仍然是0;如果数字末尾有0(且数字不是0),则反转两次后数字会变,返回false。否则,返回true。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在解题思路中提到,'如果一个数字末尾有0,第一次反转后会丢失这些0',为什么数字末尾的0在反转后会消失?
在数字反转的过程中,我们通常将数字视为字符串来处理。例如,数字100反转时首先被视为字符串'100'。反转字符串得到'001',再将其转换回数字时,前导的0在数字中是不被保留的,因此变成1。这就是为什么数字末尾的0在反转后会消失,因为在数字和字符串的转换过程中,前导0总是被省略。
🦆
提到如果数字是0,两次反转后仍然是0。能否举例说明为什么任何非零数字末尾没有0的条件下,两次反转后必定与原数字相同?
考虑一个没有末尾0的非零数字,比如123。首次反转后变成321,第二次反转再变回123。这是因为在没有末尾0的情况下,数字的每一位在反转过程中都被保留,并且顺序完全颠倒。当再次执行相同的反转操作时,所有数字的位都将恢复到原始顺序。这样,任何末尾没有0的非零数字通过两次反转都会恢复到其原始形态。
🦆
在代码中使用`num % 10 == 0`来判断数字是否以0结尾,这种方法是否可靠,存在没有考虑的边界情况吗?
使用`num % 10 == 0`来判断一个数字是否以0结尾是可靠的。这是因为这种方法直接检查数字的最低位是否是0。唯一需要注意的边界情况是数字本身为0的情况,这在代码中已经单独处理,即如果`num == 0`则返回true。因此,不存在未考虑的边界情况。
🦆
为什么在解释'数字两次反转后应该和原数字相同'时没有提到反转过程中可能遇到的其他异常或特殊情况?
反转数字的过程比较直接,只涉及到数字位的颠倒。对于整数,除了前面提到的末尾0的问题外,没有其他会影响反转结果的特殊情况。因为整数的反转涉及的操作简单(即位的颠倒),所以除了末尾0导致的前导0问题外,不存在其他特殊或异常情况,这也是为什么原解释中没有提到这些情况。

相关问题