多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
这道题主体思想是哈希映射。python的字典就使用了hash的思想。直接贴代码。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
over = []
cnt = [0 for i in range(n)]
for i in range(len(nums)):
if nums[i] in over:
continue
else:
over.append(nums[i])
for i in range(len(nums)):
x = 0
cnt[over.index(nums[i])]=cnt[over.index(nums[i])]+1
x=cnt.index(max(cnt))
return(over[x])
我这种写法比较丑,贴一个官方用C++实现的:
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int, int> counts;
int majority = 0, cnt = 0;
for (int num: nums) {
++counts[num];
if (counts[num] > cnt) {
majority = num;
cnt = counts[num];
}
}
return majority;
}
};
收获是,弄清楚了list.index()和list.append()的用法。
加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
这道题需要注意的是,可能会出现[9,9,9]->[1,0,0,0]这样的例子。
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
cnt = 0
ans =[]
for i in range(n):
cnt = cnt + digits[i]*10**(n-i-1)
cnt = cnt+1
c=len(str(cnt))
tmp = [0 for i in range(c)]
for i in range(c):
tmp[i]=int(cnt/(10**(c-i-1)))
cnt=cnt%(10**(c-i-1))
return tmp
还有一种巧妙的方法,利用python做出:
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
##先变成一个整的数字,然后做加法,然后转换成str,再转int加到新的list中
nums_str = ""
for i in digits:
nums_str =nums_str+str(i)
nums_int = int(nums_str)+1
res = []
for i in str(nums_int):
res.append(int(i))
return res
本问题中学会了python的指数表示:
3**5表示3的5次幂,也就是3*3*3*3*3,等于243
3e5表示3乘以10的5次幂,也就是3*10*10*10*10*10,结果等于300000
学会了把float数组转化成int数组的方式,即map方法:
list = [1.3, 2.3, 4, 5] #带有float型的列表
int_list = map(int,list) #使用map转换
print int_list
[1, 2, 4, 5]