回文数
题目一:
解法一:
思路:先将x
转化为字符串的形式,再把它放到list中:lst = list(str(x))
。定义头尾两个指针L=0,R=len(lst)-1
,使头尾两个值进行比对,若相等,则左指针向右移一位,右指针向左移一位继续比对。若不等,则退出,返回False
。此处不必特意判断正负,负数的第一位-
与最后一位比对会返回False
。
def isPalindrome(x: int) -> bool:
lst = list(str(x))
L, R = 0, len(lst)-1
while L <= R:
if lst[L] != lst[R]:
return False
L += 1
R -= 1
return True
print(isPalindrome(-123))
解法二:
思路:使用log计算x的位数。首先判断一定不是回文数的情况:负数、非零数最后一位为0。0属于回文数。用math.log(x,10)+1
判断x
的位数。将x
的前一半数倒序存入另一个数组。
def isPalindrome(x: int) -> bool:
if x < 0 or (x != 0 and x % 10 == 0):
return False
elif x == 0:
return True
else:
import math
length = int(math.log(x, 10)) + 1
reverse_x = 0
for i in range(length // 2): # //:除法取整
remainder = x % 10 # 取余, 即取x的最后一位数
x = x // 10 # x去掉最后一位数
reverse_x = reverse_x * 10 + remainder
# 当x为奇数时, 只要满足 reverse_x == x//10 即可
if reverse_x == x or reverse_x == x // 10:
return True
else:
return False
print(isPalindrome(-123))
知识点:
math.log(x,y)
:以y
为底求x
的对数。y
可缺省,默认为e
。
例:math.log(1000,10)=3
。 代码中使用math.log(x,10)+1可计算出x的位数。
题目二
解法:
思路:首先定义链表的结点,将输入的列表(list)转化为链表,然后打印。先使用快慢指针找出链表的中点,然后把链表的后半部分存入prev
中,使prev.next
指向上一个结点,从而使链表后半部分翻转。反转后的后半链表prev
与前半链表head
的值一一比对,若都相等则是回文数。
#定义链表的结点
class ListNode:
def __init__(self, x): #_init_:构造函数固定形式,实例化类ListNode时生效
self.val = x
self.next = None
#通过输入的列表来生成链表
def generateList(l: list):
prenode = ListNode(0)
lastnode = prenode
for val in l:
lastnode.next = ListNode(val) #将从l中取值到val,将val的值即赋到lastnode
lastnode = lastnode.next
return prenode.next #返回链表头结点(同个结点出发的.next相同)
#打印链表
def printList(l: ListNode):
while l:
print("%d, " % (l.val), end='')
l = l.next
print('')
class Solution:
def isPalindrome(self,head:ListNode) -> bool:
slow, fast, prev = head, head, None
#快慢指针找链表中点:将slow结点移动至链表的n/2位,若是奇数则是n/2+1位
while fast is not None:
slow = slow.next
fast = fast.next.next if fast.next is not None else fast.next
#反转链表后半段至prev
while slow is not None:
t = slow.next #t作用:把slow后移
slow.next = prev #使.next指向上一结点
prev = slow # prev与slow同步移动,创建后半段的链表
slow = t #slow后移,至None结束
#对比链表前半段与后半段
while head and prev:
if head.val != prev.val:
return False
head = head.next
prev = prev.next
return True
list_a = [1, 5, 5,1]
l = generateList(list_a) #生成链表
printList(l)
s = Solution()
print(s.isPalindrome(l))