LeetCode题目解答(C#简单)—9.回文数

要点:C#类型转化、取整取余、while循环

题目描述

给定一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。

回文数是指正序(从左到右)和倒序(从右到左)读都是一样的整数。例如,121是回文数,而123不是。

示例: 

示例1:输入:x = 121        输出:true           

示例2:输入:x = -121       输出:false 

示例3:输入:x = 10          输出:false                                       

解法:

1. 使用字符串解决:

将int类型的数字转化为string类型的字符串,将通过for循环遍历判断字符串的前后是否一致。

public class Solution {
    public bool IsPalindrome(int x) {
        string s = x.ToString();    //将数字转化为字符串
        //因为回文数字从前往后以及从后往前都是一样的数字,因此可以以字符串的中心为分界点,只需遍历到字符串一半的位置即可
        for(int i = 0; i < s.Length / 2; i++){    
            if(s[i] != s[s.Length-i-1]){   //比较前后的字符
                return false;
            }
        }
        return true;
    }
}

注意: C#中string类型的属性与方法需要规范书写,首字母需要大写。string类型具体的属性与方法详见:C# 字符串(String) | 菜鸟教程

2. 数学解法:

应用取整与取余获取回文数不同数位的数字进行比较。

以12321为例,12321 / 10000 = 12321 %10 = 1

(12321 % 10000)/ 1000 = 12321 % 100 / 10 = 2

以此类推。  

实际代码操作步骤如下:

1、在进行上述操作之前,我们需要知道所给数字的位数,这样才能知道最高位的数字是多少。方法是判断所给数字是不是10以及10以内的数字,如果不是则增加位数,继续去除,直到除完得到的数字是10以内数字为止,这样就能得到所给数字的最高位数:

public class Solution {
    int temp = x;
    int help = 1;
    while(temp >= 10){
        help = help * 10;  //判断数字的位数
        temp = temp / 10;
    }
}

2、得到数字的位数后,我们可以进行比较,首先比较数字的头尾,头尾不一致的情况下,直接返回false。

public class Solution {
    int temp = x;
    int help = 1;
    while(temp >= 10){
        help = help * 10;  //判断数字的位数
        temp = temp / 10;
    }
    if(x % 10 !=x / help){  //判断头尾是否一致
        return false;
}

 3、头尾一致的情况下,去掉首尾的数字,以便比较第二高位数以及第二低位数的数字,首尾数字去掉的方法依照12321的例子进行:

public class Solution {
    int temp = x;
    int help = 1;
    while(temp >= 10){
        help = help * 10;  //判断数字的位数
        temp = temp / 10;
    }
    if(x % 10 !=x / help){  //判断头尾是否一致
        return false;
    x = x % help /10;       //去掉首尾
}

4、由于首尾已经去掉了,因此现在剩下n-2位数字,继续判断去掉首尾后的数字是不是回文数,只需要重复2、3操作,唯一的变化是数字的最大数位发生了变化,因此我们只需要改变他的最大数位即可。

以“12321”为例,首尾的“1”去掉了,变成了数字“232”,因此我们可以仍然按照2、3的操作去判断,只不过取整的操作从10000变成了100。因此只要中间的数不为0,这个循环就可以无限重复下去。

最终的代码解答如图所示:

public class Solution {
    public bool IsPalindrome(int x) {
        if(x < 0){
            return false;
        }
        int help = 1;
        int temp = x;
        while(temp >= 10){
            help = help * 10;  //判断数字的位数
            temp = temp / 10;
        }
        while(x != 0){
            if(x % 10 !=x / help){  //判断头尾是否一致
                return false;
            }
            x = x % help /10;   //去掉数字的首尾
            help = help / 100;    //减少数字位数继续判断
        }
        return true;
    }
}

注意:从示例中可以看到,数字-121不是回文数字,在字符串比较的情况下永远不会判定成true,但在数字解法下需要自己规定小于0的数字都不是回文数,返回false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LeetCode是一种流行的在线刷题平台,提供了许多算法和数据结构挑战,旨在帮助程序员和计算机科学家提高他们的编程技能。以下是几个LeetCode题目及其答案: 1. 两数之和 题目描述:给定一个整数数组和一个目标值,找出数组中的两个数,它们相加等于目标值。假设每个输入只对应一种答案,并且不能使用相同的元素。 答案:遍历数组,将每个数字存储到一个哈希表中,同时计算出目标值与当前数字的差值。如果差值在哈希表中,则返回这两个数字的索引。时间复杂度为O(n)。 2. 盛最多水的容器 题目描述:给定n个非负整数a1,a2,...,an,其中每个点(i,ai)表示一个坐标。画n条垂直线,使得线i的两个端点在(i,ai)和(i,0)上。找到两条线,它们与x轴一起构成一个容器,使得容器中包含最多水。 答案:使用双指针法,分别指向数组的头部和尾部。每次计算当前容器的大小,然后根据容器两侧的高度差决定是否移动指针。时间复杂度为O(n)。 3. 无重复字符的最长子串 题目描述:给定一个字符串,请找出其中不含有重复字符的最长子串的长度。 答案:使用双指针法,分别指向子串的起始和结束位置。每次判断当前字符是否存在于子串中,如果存在,则移动起始指针到重复字符的下一个位置,否则移动结束指针。同时记录最长子串的长度。时间复杂度为O(n)。 上述题目只是LeetCode中的部分题目,不同的题目需要采用不同的算法和数据结构进行解决。通过刷LeetCode和其他类似的在线刷题平台,可以提高编程能力和算法思维能力,使得程序员更加熟练地处理各种算法问题。 ### 回答2: LeetCode是一个在线的编程题库,提供了各种不同难度和类型的编程题目。这些题目主要涵盖了算法、数据结构、字符串操作、图算法等方面的内容。 每道题目都有一个独特的编号和描述,通过阅读题目可以了解到输入和输出的形式,以及题目的具体要求。解答题目通常需要理解问题的本质,设计相应的算法,编写代码实现,并进行测试验证。 题目的难度分为简单、中等和困难三个级别,根据不同的难度以及自己的编程能力,可以选择相应的题目来挑战。 解答题目的关键在于理解问题的本质,分析解决问题的思路,并设计合适的算法实现。这个过程需要对常见的算法和数据结构有一定的了解,比如动态规划、贪心算法、递归、队列等。 对于每一道题目LeetCode提供了多种语言的代码模板,如C++、Java、Python等,可以根据自己的编程习惯和喜好选择相应的语言进行代码编写。 解答题目的过程中需要注意代码的效率和正确性,特别是对于大规模输入的情况,需要考虑时间和空间复杂度。在完成代码编写后,还需要进行测试验证,确保程序的正确性。 在解答题目过程中,可以参考其他人的解题思路和代码实现,并进行对比和学习。LeetCode还提供了题目的讨论区,可以与其他的编程爱好者交流和分享经验。 总之,通过LeetCode可以提升自己的编程能力,加深对算法和数据结构的理解,并为面试和竞赛积累经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值