[🤔Code Kata]1week-2
-DAY3-
最初の週の最高難易度...カチッと鳴らす😭
<質問>
String型str因子の中で重複しないアルファベットからなる最長単語の長さを返してください.
str:テキスト
return:重複しないアルファベットの長さ(数値を返す)
例:
方法
近づくにしても何でも、40分かけて1時間のコードカタで問題を理解しました.😭😭 俺はバカか...
問題を理解して、まず思い浮かぶのは、重複する単語を基準に単語を切り分けることです.
空のリストを作って、単語ごとに一番長いものを選びましょうか?近づいてみる
def get_len_of_str(s):
a = []
for i in s:
私が惨めに残したコードは...スライドした単語をそれぞれ結果値に抽出する方法は知っていますが...これを単独でリストに載せるべきか分からず、しばらくうろうろしていたらコードカタが終わり・・ううう
他の同期の問題を解決する方法
def get_len_of_str(s):
word = ''
word_list = []
if s == '':
return 0
for i in s:
if i not in word:
word += i
if i == s[-1]:
print(word)
word_list.append(word)
else:
word_list.append(word)
answer = len((max(word_list, key=len)))
return answer
似たような論理で近い同世代のコードを見て、頭をたたいた.word = ''
です.空文字列だとは思わなかったのですが、答えはここにあり、鬱陶しい気持ちが一気に明るくなりました(かっこいい元熙様).👍)
solution
def get_len_of_str(s):
dct = {}
max_so_far = curr_max = start = 0
for index, i in enumerate(s):
if i in dct and dct[i] >= start:
max_so_far = max(max_so_far, curr_max)
curr_max = index - dct[i]
start = dct[i] + 1
else:
curr_max += 1
dct[i] = index
return max(max_so_far, curr_max)
知らない方法で探してみたEnumerateとは?
この関数は、順序付きデータ型(リスト、凡例、文字列)を入力として受け入れ、インデックス値を含む列挙オブジェクトを返します.
for i, name in enumerate(['body', 'foo', 'bar']):
... print(i, name)
...
0 body
1 foo
2 bar
上記の例に示すように、列挙をfor文とともに使用すると、データ型の現在の順序(index)とその値を容易に知ることができる.オブジェクトの現在の位置(文など)を示すインデックス値が必要な場合は、列挙関数を使用すると便利です.変数max so far=cur max=start=0を同時に指定し、ディックシーケンスと列挙を使用して値を与えます.
100%感じられるものではなく、かなり複雑ですよね?と思っていたのですが、アルゴリズムを考える時間なので、書かれたコードがかっこいいとは嘆き難いです.👍👍
私もきっと…!!いつか!🔥
-DAY4-
数値numをパラメータとして渡す場合は、反転した形状がnumと同じかどうかを返します.
num:数値
return:true or false(反転した形状がnumと同じかどうか)
たとえば、
return false=>反転形状は321であるため、
return true=>反転形状は1221であるため、
return false=>反転形状が121-であるため、
return false=>反転形状が01のため
方法
まずは思ったより簡単かな?と思ったのですが(柿…)
DAY 2で出会った問題が頭に浮かんだので
[::-1]
を利用する方法ですが、今回も利用することにしました.def same_reverse(num):
re = str(num)[::-1]
if re == str(num):
return True
else:
return False
前日は思いもよらなかった7銭...
solution
def same_reverse(num):
num =str(num)
is_palindrome = True
for i in range(len(num) // 2):
if num[i] != num[-1 - i]:
is_palindrome = False
return is_palindrome
rangeを使用して、前後の比較でインデックスを解きます.こんな考えがあるなんて...?
アルゴリズムは本当に熟考する必要があると思います...ははは
コードスタンプにも同様の解題方法がありますが、後で見て必ず体得してください!
-DAY5-
今週中が一番難しいです.😞😞😞
strsは単語を含む配列です.
共通の開始語(prefix)を返してください.
例:
returnは「st」
「
方法
def get_prefx(strs):
if strs ==[]:
return ‘’
else:
prefix = ‘’
strs = sorted(strs)
for i in (strs[0]):
if strs[-1].startswith(prefix+i):
prefix += i
else:
break
return prefix
Code Kataのような同期で検索する方法はstartswith()
である.まだわからないうちに道理をわきまえた
str(or tuple).startswith(開始文字、開始点)
startswithは、文字列が特定の文字で始まるかどうかを示す方法です.大文字と小文字を区別し、結果値はTrue/Falseを返します.
また、パラメータ値にtupleのみが含まれ、listまたはdictが含まれている場合はエラーが発生します.(tupleを使用する場合、stringから始まる文字列にtupleがある場合はtrueを返します.)
string = "hello startswith"
print(string.startswith("hello"))
# >>True
string = "hello startswith"
print(string.startswith("Hello"))
# >>False
もう1つのendswith(終了した文字、文字列の開始、文字列の終了)方法は、特定の文字列で終了するかどうかを決定するために使用される.別の同期ブランチの解析
def get_prefix(strs):
sorted_strs = sorted(strs)
if strs == []:
return ''
if sorted_strs[0][0] != sorted_strs[-1][0]:
return ''
if len(sorted_strs[0]) > len(sorted_strs[-1]):
shortest = len(sorted_strs[-1])
elif len(sorted_strs[0]) <= len(sorted_strs[-1]):
shortest = len(sorted_strs[0])
answer = []
for i in range(shortest):
if sorted_strs[0][i] == sorted_strs[-1][i]:
answer.append(sorted_strs[0][i])
print(answer)
return ''.join(answer)
これも不思議ですね.初めて見た
sorted_strs[0][0]
!まずアルファベット順に分類し、if文で最初の単語と最後の単語の頭文字が同じかどうかを計算します.
もしあなたがドアが長くて多いと言ったら、私から見ればあなたはよく編んでいますね.勉強させてください.
solution
def get_prefix(strs):
if len(strs) == 0:
return ''
res = ''
strs = sorted(strs)
for i in strs[0]:
if strs[-1].startswith(res+i):
res += i
else:
break
return res
同時期の回答と完全一致!(わあ)アプローチは理解できましたが、コードを100%生成できないので、来週復習することにしました!
がんばれ~~~!
Reference
この問題について([🤔Code Kata]1week-2), 我々は、より多くの情報をここで見つけました https://velog.io/@fhwmqkfl/CodeKata1week-345テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol