Codewar记录一
问题描述:

我的解决方案:
1 def get_sum(a,b): 2 return sum(range(min(a, b), max(a, b) + 1))
一种巧妙的解决方案:
1 def get_sum(a, b): 2 return (a + b) * (abs(a - b) + 1) // 2
第二个问题:
去除字符串的元音字母
法一:
def disemvowel(s): translator = str.maketrans({key: None for key in "aeiouAEIOU"}) return s.translate(translator)
法二:
1 def disemvowel(s): 2 for i in "aeiouAEIOU": 3 s = s.replace(i,'') 4 return s
法三:
1 def disemvowel(string): 2 return "".join(c for c in string if c.lower() not in "aeiou")
法四:
1 def disemvowel(s): 2 translator = str.maketrans({key: None for key in "aeiouAEIOU"}) 3 return s.translate(translator)
问题三:求解连续子序列的最大值
1 def maxSequence(arr): 2 max,curr=0,0 3 for x in arr: 4 curr+=x 5 if curr<0:curr=0 6 if curr>max:max=curr 7 return max
max_sequence([-2, 1, -3, 4, -1, 2, 1, -5, 1000])
n = 12; decomp(12) -> "2^10 * 3^5 * 5^2 * 7 * 11"
since 12! is divisible by 2 ten times, by 3 five times, by 5 two times and by 7 and 11 only once.
n = 22; decomp(22) -> "2^19 * 3^9 * 5^4 * 7^3 * 11^2 * 13 * 17 * 19"
n = 25; decomp(25) -> 2^22 * 3^10 * 5^6 * 7^3 * 11^2 * 13 * 17 * 19 * 23
我的方案:
import math def isPrime(n): if n <= 1: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True def decomp(n): #your code here m = math.factorial(n) str_ = "" for i in range(2,n+1): num = 0 if isPrime(i): while (m%i == 0): m = m // i #这里注意是双分号,不然处理不了超大数字的除法 num += 1 if num == 1: str_ += "{0} * ".format(i) else: str_ += "{0}^{1} * ".format(i,num) str_ = str_.strip(" * ") return str_ decomp(3990)
其他人的解法:
from collections import defaultdict def dec(n): decomp = defaultdict(lambda:0) i = 2 while n > 1: while n % i == 0: n /= i decomp[i] += 1 i += 1 return decomp def decomp(n): ans = defaultdict(lambda:0) for i in range(2, n + 1): for key, value in dec(i).items(): ans[key] += value return ' * '.join('{}^{}'.format(x, y) if y > 1 else str(x) for x, y in sorted(ans.items()))
问题5:
An anagram is the result of rearranging the letters of a word to produce a new word (see wikipedia).
Note: anagrams are case insensitive
Complete the function to return true if the two arguments given are anagrams of each other; return false otherwise.
Examples
-
"foefet"is an anagram of"toffee" -
"Buckethead"is an anagram of"DeathCubeK"
1 #include <string>#先转换成集合,再对待比较的2个集合遍历集合中的每个元素,是狗相等,不等则提前退出 2 #include<algorithm> 3 using namespace std; 4 bool isAnagram(std::string test, std::string original){ 5 //your code here 6 transform(original.begin(),original.end(),original.begin(),::tolower); 7 transform(test.begin(),test.end(),test.begin(),::tolower);#大小写转换 8 string s=""; 9 cout << original <<endl; 10 for (unsigned long i=0;i<original.size();i++) 11 { 12 if(s.find(original[i],0)>10000) 13 { 14 s += original[i]; 15 } 16 } 17 for (unsigned long i=0;i<s.size();i++) 18 { 19 int num1 = 0; 20 int num2 = 0; 21 cout<<s[i]<<endl; 22 for (unsigned long j=0;j<original.size();j++) 23 { 24 if(original[j]==s[i]) 25 { 26 num1+=1; 27 } 28 } 29 cout << num1 <<endl; 30 for (unsigned long j=0;j<original.size();j++) 31 { 32 if(test[j]==s[i]) 33 { 34 num2+=1; 35 } 36 } 37 cout << num2 <<endl; 38 if (num1!=num2) return false; 39 } 40 41 return true; 42 43 }
法二:
#include <string> bool isAnagram(std::string t, std::string o){ if(t.size() != o.size()) return false; std::transform(t.begin(),t.end(),t.begin(),::tolower); std::transform(o.begin(),o.end(),o.begin(),::tolower); std::sort(t.begin(),t.end()); std::sort(o.begin(),o.end()); return t==o; }
问题5:

依次遍历:
1 //递归 2 def snail(snail_map): 3 n = len(snail_map) 4 new = [] 5 if (len(snail_map[0])==0):return new 6 else: 7 for i in range(n): 8 new.append(snail_map[0][i]) 9 for i in range(1,n): 10 new.append(snail_map[i][n-1]) 11 for i in range(n-2,-1,-1): 12 new.append(snail_map[n-1][i]) 13 for i in range(n-2,0,-1): 14 new.append(snail_map[i][0]) 15 if (len(snail_map)-2<=0):return new 16 else: 17 map = [] 18 for i in range(1,n-1): 19 map.append(snail_map[i][1:n-1]) 20 new.extend(snail(map)) 21 return new 22 23 //别人的方法; 24 def snail(array): 25 ret = [] 26 if array and array[0]: 27 size = len(array) 28 for n in xrange((size + 1) // 2): 29 for x in xrange(n, size - n): 30 ret.append(array[n][x]) 31 for y in xrange(1 + n, size - n): 32 ret.append(array[y][-1 - n]) 33 for x in xrange(2 + n, size - n + 1): 34 ret.append(array[-1 - n][-x]) 35 for y in xrange(2 + n, size - n): 36 ret.append(array[-y][n]) 37 return ret 38 39 40 41 // 42 def snail(array): 43 if array: 44 # force to list because zip returns a list of tuples 45 top_row = list(array[0]) 46 # rotate the array by switching remaining rows & columns with zip 47 # the * expands the remaining rows so they can be matched by column 48 rotated_array = zip(*array[1:]) 49 # then reverse rows to make the formerly last column the next top row 50 rotated_array = rotated_array[::-1] 51 return top_row + snail(rotated_array) 52 else: 53 return []
问题6:数字转字符串
1 #include <string> 2 3 std::string number_to_string(int num) { 4 std::string ret; 5 bool neg = num < 0; 6 num = abs(num); 7 while(num) { 8 ret += num % 10 + '0'; 9 num /= 10; 10 } 11 if(neg) ret += '-'; 12 std::reverse(ret.begin(), ret.end()); 13 return ret; 14 }
问题7:2数之和问题,这个题在力扣见到过,就是给定一个数组和target,找到2数之和为target的对应的索引,如果有多个答案,则优先返回第一个。
C++是真的恶心,看书都能看懂,自己写代码全是错,要么就是左右的类型问题,比如for循环里,控制变量的值和初始化的值类型不同;要么就是const左右类型问题;要么就是没加域名限定符;然后各种STL的方法也没记得很清楚
C++返回元素对应的索引:
1 vector<double>::iterator ite1 = find(vec_dis.begin(), vec_dis.end(), vec_dis1[0]); 2 vector<double>::iterator ite2 = find(vec_dis.begin(), vec_dis.end(), vec_dis1[1]); 3 vector<double>::iterator ite3 = find(vec_dis.begin(), vec_dis.end(), vec_dis1[2]); 4 auto index1 = std::distance(std::begin(vec_dis), ite1); 5 auto index2 = std::distance(std::begin(vec_dis), ite2); 6 auto index3 = std::distance(std::begin(vec_dis), ite3);
https://blog.csdn.net/sptoor/article/details/6615729常见的const迭代器有关内容
解决方案:
1 #include <vector> 2 #include <algorithm> 3 #include <iostream> 4 5 6 std::pair<std::size_t, std::size_t> two_sum(const//参数是const vector,所以后面的迭代器类型也应是const std::vector<int>& numbers, int target) { 7 std::pair<std::size_t,std::size_t> p; 8 std::vector<int> v{}; 9 for (unsigned long i=0;i<numbers.size();i++) //迭代器的类型一般都是unsigned long 10 { 11 std::cout << target<<std::endl; 12 if (std::find(v.cbegin(), v.cend(), target - numbers[i]) == v.cend()) 13 { 14 v.push_back(numbers[i]); 15 } 16 else 17 { 18 std::vector<int>::const_iterator ite1 = std::find(v.cbegin(), v.cend(),target - numbers[i]); 19 auto index1 = std::distance(std::cbegin(v), ite1); 20 p.first = index1; 21 p.second = i; 22 return p; 23 } 24 } 25 }
其他解决方案:
1 #include <unordered_map> 2 3 std::pair<std::size_t, std::size_t> two_sum(const std::vector<int>& numbers, int target) { 4 std::unordered_map<int, std::size_t> counterparts; 5 for (std::size_t i = 0; i < numbers.size(); ++i) { 6 auto it = counterparts.find(numbers[i]); 7 if (it != counterparts.end()) 8 return {it->second, i}; 9 counterparts.emplace(target - numbers[i], i); 10 } 11 return {-1, -1}; 12 }
浙公网安备 33010602011771号