Leetcode 2119.反转两次的数字

反转 一个整数意味着倒置它的所有位。

  • 例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。

给你一个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num ,返回 true ;否则,返回 false 。

示例 1:

输入:num = 526
输出:true
解释:反转 num 得到 625 ,接着反转 625 得到 526 ,等于 num 。

示例 2:

输入:num = 1800
输出:false
解释:反转 num 得到 81 ,接着反转 81 得到 18 ,不等于 num 。 

示例 3:

输入:num = 0
输出:true
解释:反转 num 得到 0 ,接着反转 0 得到 0 ,等于 num 。

一、信息

1.反转的定义

2.这道题目的目的是给我一个整数num,反转num得到reversed1,接着反转reversed1得到reversed2,如果reversed2等于num,返回true否则false

二、分析

条件1:告诉我反转是什么

条件2:告诉我返回值的类型和规则,其实很简单因为返回torf因此我们可以定义函数的类型位布尔类型返回布尔值即可。

思路:

看到这道题目我有一条思路

第一条路:我们可以用取余和取百分比的不断获取整数num的个十百千位然后逆序然后再用同样的函数调用一边即可我的答案的第一部分首先考虑了实现一个反转整数的函数。我采用了常见的通过模10取余数得到数字的最后一位,然后整除10来移除最后一位的方法,来实现整数的反转。这个思考过程较为直接和基础,是初学者常用的解题方法。

第二条思路

五、实现 

我的答案:

C++:

#include <stdio.h>
#include <stdbool.h>

int reverse(int num) {
    int reversed = 0;
    while (num > 0) {
        int remainder = num % 10;
        reversed = reversed * 10 + remainder;
        num = num / 10;
    }
    return reversed;
}

bool isReversedTwiceTheSame(int num) {
    int reversed1 = reverse(num);
    int reversed2 = reverse(reversed1);
    return reversed2 == num;
}

int main() {
    int num1 = 526;
    int num2 = 1800;
    int num3 = 0;

    printf("%d -> %sn", num1, isReversedTwiceTheSame(num1) ? "true" : "false");
    printf("%d -> %sn", num2, isReversedTwiceTheSame(num2) ? "true" : "false");
    printf("%d -> %sn", num3, isReversedTwiceTheSame(num3) ? "true" : "false");

    return 0;
}

Leetcode题解:

 源代码:

#include <stdbool.h>

bool isSameAfterReversals(int num) {
    return num == 0 || num % 10 != 0;
}

总结:

学到了什么?

从这道题目中,我们可以学到几个关键的概念和编程实践:

1. **数学思维**:
   - **充分必要条件**的思考是解题的关键。首先考虑何时两次反转会得到原数,然后思考这些条件是不是必要的,是不是充分的。
   - **模运算**:通过对10取模来判断一个数的个位数。

2. **编程思维**:
   - 逻辑简化:题目可能看起来复杂,需要多步操作,但有时候通过逻辑推理和数学运算可以极大地简化问题,例如这道题目中,无需实际进行反转操作,通过判断就可以得到结果。
   - 代码优化:简化逻辑并不总是降低代码的可读性。在许多情况下,它实际上会使代码变得更清晰,更易于理解,同时还提高了代码的效率。

3. **细节处理**:
   - 对于特殊的边界情况,例如这里的0,需要单独考虑。
   - 注意题目中的条件限制和例子,这会帮助我们更快地理解题目要求。

4. **问题分析与解决策略**:
   - 在解决问题时,我们首先需要深入理解问题,分析问题的本质。这道题的本质是考察反转操作对数的位数的影响,以及如何通过数学方法简化计算。
   - 其次,我们需要寻找解决问题的策略。这可能涉及到对问题进行逐步分解,或者转化为更容易解决的问题。

通过综合运用数学知识、编程技能、逻辑分析和解决问题的策略,我们可以更有效地解决编程问题。