一、旋转字符串
题目描述
给定两个字符串, A 和 B。
A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。
如果在若干次旋转操作之后,A 能变成B,那么返回True。
示例
示例 1:
输入: A = 'abcde', B = 'cdeab'
输出: true
示例 2:
输入: A = 'abcde', B = 'abced'
输出: false
解题
class Solution:
def rotateString(self, s: str, goal: str) -> bool:
return len(s) == len(goal) and goal in s + s
由于s + s
包含了所有可以通过旋转操作从 s 得到的字符串,
因此我们只需要判断goal
是否为s + s
的子串即可。
二、数组中出现次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
解题
from collections import Counter
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
for k, v in dict(Counter(nums)).items():
if v >= n / 2:
return k
涉及到出现次数的,我优先还是使用了Counter。
Counter(nums)
,然后转为dict
,方便k,v
遍历。- 知道了数组长度
n
,遍历数组时候,判断出现次数v
是否>= n / 2
即可。
如果不用Counter
的话,也可以自己建一个字典,遍历下数组,把各数出现的次数统计到字典里去,剩下
的就跟上面一样了。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
hash_table = dict()
for i in nums:
if i in hash_table:
hash_table[i] = hash_table[i] + 1
else:
hash_table[i] = 1
for k, v in hash_table.items():
if v >= n / 2:
return k
三、反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
解题
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
n = len(s)
right = 0
left = n - 1
while right < left:
s[right], s[left] = s[left], s[right]
right += 1
left -= 1
if right >= left:
return s
使用双指针,思路:
- 指针
right
和指针left
分别在输入数组s
的两头。 - 当
right < left
,就互相进行交互。然后右指针向左移动+1
,左指针向右移动-1
。 - 当
right >= left
,说明交换完毕。这里大于等于是考虑 数组长度为 偶数和奇数的情况。
四、回文链表
题目描述
请判断一个链表是否为回文链表。
示例
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解题
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
temp_list = []
cur = head
while cur:
temp_list.append(cur.val)
cur = cur.next
return temp_list == temp_list[::-1]
回文链表是啥?就是链表反顺序过来还和之前的一样。那么,如果把链表中的元素都放到数组里,如果这个数组和反序的数组一样,
就说明了这个是回文链表了。
- 声明一个数组
temp_list
。 - 声明一个辅助指针
cur
,指向head
。 - 遍历链表,把每个元素的值添加到数组中,
temp_list.append(cur.val)
。 - 然后指针继续向后移动,
cur = cur.next
- 最后比较数组与反序数组是否相等。
五、回文数
题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
解题
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
str_x = str(x)
return str_x == str_x[::-1]
跟上面回文链表解法一致,注意下负数直接返回Fasle。
- 将int转为字符串
- 比较字符串和反序字符串是否一致。