LeetCodeでひっかかったあれこれ

筆者がleetcodeで止まったことのあれこれを書いてます！

#### range
```python
for i in range(len(nums)-2, 0, -1): 
  # nums = [1,1,1,2,2,3]の場合
  # i : 4（第1引数は含む） -> 1（第2引数は手前まで）
```
<br/><br/>

#### pop
```python
nums.pop(i+1)
  # pop(index)で、そのindexをリストから削除できる
```
popは、pop()で末尾を取り除くだけではなかったんですね！

<br/><br/>

#### vscodeでのデバッグ
```↓```をクリックすると、関数内に入っての実行ができる。

<br/><br/>

#### 型ヒント
```python
from typing import List
```
型ヒントでエラーが出たらこれです！

<br/><br/>

#### vscodeでの実行
```python
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
    # ↓↓↓実行↓↓↓
    print(Solution().removeDuplicates(nums))
```
<br/><br/>

#### sortとsorted
```python
# sort  : 破壊的
l = [9, 5, 3, 1, 7]
l.sort()
print(l)         # [1, 3, 5, 7, 9]

# sorted: 非破壊的
l = [9, 5, 3, 1, 7]
l_sorted = sorted(l)  # lの位置も違います！ 
print(l_sorted)  # [1, 3, 5, 7, 9]
print(l)         # [9, 5, 3, 1, 7]
```
<br/><br/>

#### リストの中身を順々に使っていく
```python
list = [5, 7, 1]

for list_element in list:
    print(list_element)
# 5
# 7
# 1
```
<br/><br/>

#### 文字列はリストに変換なくても、forでそのまま使えます！
```python
for symbol in "MCXV":
    print(symbol)
# M
# C
# X
# V
```
<br/><br/>

#### 辞書型の超基本（なかなか使わないので、忘れてました）
```python
dict={ "a":"apple" , "b":"banana" , "c":"choco" }
print(dict["a"]) # 引数はキーです
# apple

# 値の追加
dict1["d"]="dessert"
print(dict1)
# {'a': 'apple', 'b': 'banana', 'c': 'choco' , 'd': 'dessert'}
```
<br/><br/>

#### replaceに再帰性はない
```python
str = "aaabb"
str = str.replace("ab", "bb")
print("replace x 1回:",str)

str = str.replace("ab", "bb")
print("replace x 2回:",str)

# replace x 1回: aabbb
# replace x 2回: abbbb
```
まあ、普通は再帰的に実行されるとは思いませんが、leetcodeをしている時にふと不安になったので。

<br/><br/>

#### replaceは再代入が必要
```python
str = "fix me"
str_fixed = str.replace("fix", "fixed")
print(str)
# fix me

print(str_fixed)
# fixed me
```
```str```に```replace```が反映されていないことがポイントです！

<br/><br/>

#### 文字列でも```~[i]```が使える！
```python
string = "STR"
print(string[1])
# T
```
<br/><br/>

#### 文字列の連結は```+```でOK
```python
string = "STR"
integer = "int"
print(string + integer)
# STRint
```
<br/><br/>

#### リスト要素を```for```で取り出す時、```range(len(list))```は不要
```python
words = ["flower","flow","flight"]
for word in words:
    print(word)
# flower
# flow
# flight
```
<br/><br/>

#### ```strip```は前後の指定文字を消す
```python
space_words_space = "  some  spaces  "
print("->"+space_words_space+";")
# ->  some  spaces  ;

only_words = space_words_space.strip()
print("->"+only_words+";")
# ->some  spaces;
```
<br/><br/>

#### リストの逆順は、```reverse()```もしくは```~[::-1]```
```python
normal_list = [1, 2, 3, 4, 5]
normal_list.reverse()
print(normal_list)
# [5, 4, 3, 2, 1]

normal = [1, 2, 3, 4, 5]
reverse = normal[::-1]
print(reverse)
# [5, 4, 3, 2, 1]
```

<br/><br/>

#### ```split(引数なし)```は、スペースが複数挟まってても全部削除してくれる！
```python
s = "a good   example"
s = s.split()
print(s)
# ['a', 'good', 'example']
```

<br/><br/>

#### ```set```型にすると重複がなくなる
```python
pattern = "abba"
set_pattern = set(pattern)
print(set_pattern)
# {'b', 'a'}
```
<br/><br/>

#### 長い方に合わせる```zip```：```zip_longest```
```python
str_num = ['one', 'two', 'three']
int_num = [1, 2]
for str_int in zip(str_num, int_num):
    print(str_int)
# ('one', 1)
# ('two', 2)
    
from itertools import zip_longest
for str_int in zip_longest(str_num, int_num):
    print(str_int)
# ('one', 1)
# ('two', 2)
# ('three', None)
```
```zip```は、最も短いものに合わせます。

<br/><br/>

#### ```A == B == C```は可能！
```python
test1, test2, test3 = "test", "test", "test"
print(test1 == test2 == test3)
# True
```
<br/><br/>

#### 要素 -> インデックス は、```index```
```python
nums = [30, 50, 10, 40, 20]
print(nums.index(20))
# 4
```
<br/><br/>

#### window問題は、```for```&```for```ではなく、```for```&```while```
```python
# nums = [2,3,1,2,4,3]
# target = 7
for i in range(len(nums)):
    total += nums[i]
    while total >= target:
        element_counter = min(element_counter, i-left_index+1)
        total -= nums[left_index]
        left_index += 1
```
```for```&```for```だと、左indexを増やせません。
該当問題：[209. Minimum Size Subarray Sum
](https://leetcode.com/problems/minimum-size-subarray-sum/description/?envType=list&envId=r2qbwhe6)

<br/><br/>

#### ```range```の第一引数で、```for```の最初のインデックスを指定できる
```python
nums = [0, 1, 2, 3]
for i in range(2, len(nums)):
    print(i)
# 2
# 3

# 普段のrange
for i in range(0, len(nums)):
    print(i)
# 0
# 1
# 2
# 3
```
<br/><br/>

#### 文字列でも```len()```可能
```python
test_string = "test"
print(len(test_string))
# 4
```
<br/><br/>

### 集合
#### 初期化=>```set()```もしくは```{ 要素 }```
```python
empty_set = set()
print(type(empty_set))
# <class 'set'>

even_nums = {0, 2, 4, 6}
print(type(even_nums))
# <class 'set'>
```
集合（```set型```）には要素順序なし。
<br/><br/>

#### 要素追加=>```add```
```python
nums = set((1, 2, 3))  # タプルから集合を生成
print(nums)
# {1, 2, 3}

nums.add(4)
print(nums)
# {1, 2, 3, 4}
```
<br/><br/>

#### リストの一番最後：```~[-1]```
```python

```
<br/><br/>

#### 
```python

```
<br/><br/><br/>

## メモリパフォーマンス向上 
#### 
```python

```

<br/><br/><br/>

## 番外編
#### zip
二つのリストを対応させながら処理したい時に有効です！
```python
names  = ['momo', 'urashima', 'kaguya']
ages   = [16, 20, 18]
zipped = zip(names, ages)
for name, age in zipped:
   print( 'name:' + name + '  age:' + str(age) )
# name:momo  age:16
# name:urashima  age:20
# name:kaguya  age:18

# castとすると型変更できます
dictionary = dict(zipped)
```
[参考URL](https://camp.trainocate.co.jp/magazine/python-zip/)


<br/><br/>

#### ```in list```は死ぬほど遅い、```in set```を使うべき！
[参考Qiita](https://qiita.com/cof/items/05f6ffc6d4e5b062aaa9)

<br/><br/>

#### ```tuple```と```set```は別物
```python
example_set = set()
print(type(example_set))
# <class 'set'>

# tupleは要素変更できないlist
example_tuple = ('test',)
print(type(example_tuple))
# <class 'tuple'>
```

<br/><br/><br/>

## 良さげな変数名
#### 一時保存の合計値
```python
# sumは、sum関数と被る
total
```