回文数
题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
题解:利用字符串,数学解法
- 思路一: 将数字转换成字符串,字符串翻转之后,比较两个字符串是否相等即可。
- Python代码如下:
class Solution:
def isPalindrome(self, x: int) -> bool:
x = str(x)
return x == x[::-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