LeetCode &算法刷题笔记:回文数,回文链表,回文素数,反转链表

回文数

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

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

示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

题解:利用字符串,数学解法
  1. 思路一: 将数字转换成字符串,字符串翻转之后,比较两个字符串是否相等即可。
  • Python代码如下
class Solution:
    def isPalindrome(self, x: int) -> bool:
      x = str(x)
      return x == x[::-1]
  1. 思路二: 进阶解法—数学解法
  • 取出后半段数字进行翻转。
  • 这里需要注意的一个点就是由于回文数的位数可奇可偶,所以当它的长度是偶数时,它对折过来应该是相等的;当它的长度是奇数时,那么它对折过来后,有一个的长度需要去掉一位数(除以 10 并取整)。

具体做法如下:

  • 每次进行取余操作 ( %10),取出最低的数字:x % 10
  • 将最低的数字加到取出数的末尾:cur = cur * 10 + x % 10
  • 每取一个最低位数字,x 都要自除以 10
  • 判断 x 是不是小于 revertNum ,当它小于的时候,说明数字已经对半或者过半了
  • 最后,判断奇偶数情况:如果是偶数的话,revertNum 和 x 相等;如果是奇数的话,最中间的数字就在cur 的最低位上,将它除以 10 以后应该和 x 相等。
  • Python代码如下
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
        cur = 0
        while(x>cur):
            cur = cur * 10 + x % 10
            x = x // 10
        return x == cur // 10 or x == cur
回文链表

题目: 编写一个函数,检查输入的链表是否是回文的。

示例 1:
输入: 1->2
输出: false

示例 2:
输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题思路:先将链表转换为数组,然后利用数组反转即可。
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        res = []
        while (head is not None):
            res.append(head.val)
            head = head.next
        return res[::-1] == res
回文素数
题目: 求出大于或等于 N 的最小回文素数。

回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。
例如,2,3,5,7,11 以及 13 是素数。
回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。例如,12321 是回文数。

示例 1:
输入:6
输出:7

示例 2:
输入:8
输出:11

示例 3:
输入:13
输出:101

反转链表

题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:
0 <= 节点个数 <= 5000

解题思路:双指针,一个在前,一个在后
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        pre,cur = head,None
        while pre:
            t = pre.next
            pre.next = cur
            cur = pre
            pre = t
        return cur
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值