一、 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
这个算法就比较简单了。观察一下数据变化。 这个算法就是让我们一点后面几位数到前面去就行。我们用一下列表的切割用法就可以了。
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
#计算列表长度
len_list = len(nums)
#k 的取值有可能大于nums的长度,我们只需要取个摸即可
k = k%(len_list)
#第一部分为要前移动的值,后面一部分为原来不懂的值
nums[:] = nums[len_list-k:] +nums[:len_list-k]
return nums
二、存在重复元素
给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
输入: [1,2,3,1]
输出: true
输入: [1,2,3,4]
输出: false
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
class Solution(object):
def containsDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
#原列表长度
len_star = len(nums)
#去重后列表长度
len_end = len(set(nums))
#判断二者是否不等,不等返回 true 有重复值,相等,返回 false 不存在重复值
return len_star != len_end
三、 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
输入: [2,2,1]
输出: 1
输入: [4,1,2,1,2]
输出: 4
下面第一个自己写的,写完之后感觉写的好复杂。我思路是这样子的。
先用字典保存每个值出现次数。
之后输出出现次数为1的
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#去重
myset = set(nums)
dict = {}
#里面保存key-健值,valuse-重复次数,
for item in myset:
dict[item] = nums.count(item)
#判断重复次数是否为1,
if 1 in dict.values():
return list(dict.keys())[list(dict.values()).index(1)]
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#异或运算,二进制运行,相同为0,不同为1
#去重,相同为0,所有只要出现重复就可抵消,剩下值为唯一值
a = 0
for i in nums:
a = a ^ i
return a