33.把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数.根据丑数的定义实现代码
class Solution:
def GetUglyNumber_Solution(self, index):
# write code here
# 从一到六全是丑数,当index<7时,减少了运算,大于7后没有什么用
if index < 7:
return index
t2, t3, t5 = 0, 0, 0
ans = [1]
# 每一个丑数一定是2|3|5 一个或多个的乘积
for i in range(1, index):
# 每次添加一个最小的
ans.append(min(ans[t2]*2, ans[t3]*3, ans[t5]*5))
# 每次都用当前位与之前为*2|3|5比较。
if ans[i] == ans[t2]*2:
t2 += 1
if ans[i] == ans[t3] * 3:
t3 += 1
if ans[i] == ans[t5] * 5:
t5 += 1
# 数组下标从0开始,所以需要减1
return ans[index - 1]
34.在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 熟悉python的方法
class Solution:
def FirstNotRepeatingChar(self, s):
# write code here
for i,ch in enumerate(s):
if s.count(ch) == 1:
return i
return -1
35.在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
class Solution:
def InversePairs(self, data):
# write code here
return self.inverseCount(data[:], 0, len(data)-1, data[:]) % 1000000007
def inverseCount(self, tmp, start, end, data):
if end - start < 1:
return 0
if end - start == 1:
if data[start] <= data[end]:
return 0
else:
tmp[start], tmp[end] = data[end], data[start]
return 1
mid = (start + end) // 2
cnt = self.inverseCount(data, start, mid, tmp) +
self.inverseCount(data, mid+1 , end, tmp)
i = start
j = mid + 1
ind = start
while(i <= mid and j <= end):
if data[i] <= data[j]:
tmp[ind] = data[i]
i += 1
else:
tmp[ind] = data[j]
cnt += mid -i + 1
j += 1
ind += 1
while(i <= mid):
tmp[ind] = data[i]
i += 1
ind += 1
while(j <= end):
tmp[ind] = data[j]
j += 1
ind += 1
return cnt
36.输入两个链表,找出它们的第一个公共结点。
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
p1 = pHead1
p2 = pHead2
//当p1,p2不相等时
while(p1!=p2):
//若是长度不相等时,使其指向同一个链表,否则指向下一个
p1 = (pHead2 if p1 is None else p1.next)
p2 = (pHead1 if p2 is None else p2.next)
return p1