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 }

 

posted on 2020-11-20 15:33  Jimming  阅读(82)  评论(0)    收藏  举报

导航