diff --git a/Archer/Happy Number/Happy Number.py b/Archer/Happy Number/Happy Number.py new file mode 100644 index 0000000..3e0be3d --- /dev/null +++ b/Archer/Happy Number/Happy Number.py @@ -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 + diff --git "a/Archer/Happy Number/Happy Number\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" "b/Archer/Happy Number/Happy Number\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" new file mode 100644 index 0000000..05eb5af --- /dev/null +++ "b/Archer/Happy Number/Happy Number\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" @@ -0,0 +1,9 @@ +# 算法实现:(详细见代码文档) # + +#编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。 # + +# 复盘 # + +1. 用两个字典,一个字典存储加法结果各位数的平方,另一个字典存储平方之和 + +2. 用一个字典存储平方之和,判断有无循环即可,不需要存储各个平方,直接加在一起便是 \ No newline at end of file diff --git a/Archer/lengthOfLongestSubstring/20181211-lengthOfLongestSubstring-Archer-1.py b/Archer/lengthOfLongestSubstring/20181211-lengthOfLongestSubstring-Archer-1.py new file mode 100644 index 0000000..3986e2b --- /dev/null +++ b/Archer/lengthOfLongestSubstring/20181211-lengthOfLongestSubstring-Archer-1.py @@ -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] +''' + diff --git a/Archer/lengthOfLongestSubstring/20181214-lengthOfLongestSubstring-Archer-2.py b/Archer/lengthOfLongestSubstring/20181214-lengthOfLongestSubstring-Archer-2.py new file mode 100644 index 0000000..62a4eed --- /dev/null +++ b/Archer/lengthOfLongestSubstring/20181214-lengthOfLongestSubstring-Archer-2.py @@ -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(j-i)] + else : + del dict[s[i]] + i += 1 +''' +# 直接找字符串,用find,如果找到,先得到字符串大小,再把索引i往前移到找到的索引,优点是不用一直把前面的删掉,进一步优化效率 + +j = 1 +i = 0 + + +while j