Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions Archer/Happy Number/Happy Number.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Solution(object):
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""

dict_1 = {}

while 1:
sum = 0

while n != 0: #计算平方之和
sum += (n % 10) ** 2
n /= 10

n = sum

if n == 1: #如果平方之和为1,证明n是快乐数,返回True
return True
elif dict_1.has_key(n): #若平方之和已出现过(循环计算),证明加法之和不可能为1,n不是快乐数,返回False
return False

dict_1[n] = 0

9 changes: 9 additions & 0 deletions Archer/Happy Number/Happy Number说明及复盘.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# 算法实现:(详细见代码文档) #

#编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。 #

# 复盘 #

1. 用两个字典,一个字典存储加法结果各位数的平方,另一个字典存储平方之和

2. 用一个字典存储平方之和,判断有无循环即可,不需要存储各个平方,直接加在一起便是
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-

s = "vdlkdk"
dict = {}
num = 0
out = 0
flag = 0
i = 0
#暴力法1:找到所有不重复的字符串
'''
for i in range(0,len(s)) :
dict[s[i]] = i
num += 1
for j in range(i+1,len(s)) :
if s[j] in dict :
break
dict[s[j]] = j
num += 1
out = [num, out][out > num]
if out >= len(s) / 2 :
break
dict.clear()
num = 0
'''

#暴力法2:从输出长度out入手
'''
for out in range(0,len(s)):
for i in range(0,out+1):
for j in range(i,i+len(s)-out):
if s[j] in dict:
dict.clear()
break
dict[s[j]] = j
else:
flag = 1
if flag == 1:
break
if flag == 1:
break

print len(s)-out
'''
#滑动法,当往右滑动到右重复字符时,从前面重复的那个字符后开始搜索,不断循环
'''
n = len(s)
while i < n:
if s[i] in dict:
i = dict[s[i]] + 1
out = [num, out][out > num]
num = 0
dict.clear()
dict[s[i]] = i
num += 1
i += 1
continue
dict[s[i]] = i
num += 1
i += 1
out = [num, out][out > num]
'''

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-


s = ""
set0 = set()
dict = {}
num = 0
out = 0
flag = 0
i = 0
j = 0

n = len(s)


# 索引i和j分别表示子字符串的起始和结束,如何有相同的字符,则一直把前面的删掉,知道没有重复为止
'''
while i<n and j<n:
if (s[j] in dict) == False :
dict[s[j]] = j
j += 1
out = [j-i,out][out>(j-i)]
else :
del dict[s[i]]
i += 1
'''
# 直接找字符串,用find,如果找到,先得到字符串大小,再把索引i往前移到找到的索引,优点是不用一直把前面的删掉,进一步优化效率

j = 1
i = 0


while j<n :
cur = s.find(s[j],i,j)
if cur != -1:
out = max(j-i,out)
i = cur+1
j += 1

if n != 0:
out = max(j-i,out)
else :
out = 0

print out
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,18 @@

# 复盘 #

应该还可以改进另一种算法,更简洁
应该还可以改进另一种算法,更简洁

# 最终总结 #

该问题可以表述为:

对于字符串s

设索引i和j表示子字符串的起始和结尾,i=0,j=0

在j不断增加的过程中,判断s[j]是否在i和j间的子字符串中(重复值在子字符串中的位置标记为cur):

若是,得出字符串长度j-i,取输出out和j-i的最大值更新out,并且移动索引i:

i=cur+1(也可以一步一步移动i:i=i+1,不过这样的话j要在没有重复时才能往后增加)
6 changes: 6 additions & 0 deletions Archer/readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
##1217-1219 打卡##
**编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。**

##1213-1215 打卡##
**给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。**

##1210-1212 打卡##
**给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。**

Expand Down
7 changes: 0 additions & 7 deletions Archer/twoSum/twoSum.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,6 @@ def twoSum(nums, target):
for i in range(0, k):
temp = target - nums[i]
if temp in map_a :
print map_a.items()
return [map_a[temp], i]
map_a[nums[i]] = i
'''

a = [3, 3, 4, 5]

b = twoSum(a,8)

print b