HHKB Professional HYBRIDを買って半年ちょっと使っている話。

イメージ
昨年の9月に購入しましたHHKB。 一時期英語配列のキーボードを使っていましたが、今回は日本語配列をチョイス。 PFU キーボード HHKB Professional HYBRID 日本語配列/墨 良かったところ タイピング時の打鍵感、音が心地良い     これがかなりデカい。直近の生成AI周りの発展のおかげで直接タイピングしてコードを書くことは以前に比べるとかなり減ったけど、それでも全然使うのでここのストレスがないことは大きい。 ただ、これも人による部分が大きいと思う部分なので事前に触れる箇所があれば触った方が良い。 HHKBの公式サイトにタッチ&トライスポット というページがあるので実際の打鍵感や音を確認したい人はそこで検索してのをおすすめします。 僕の場合、当初は HHKB Studio を買おうと思って秋葉原の遊舎工房というお店で触らせてもらいましたが、正直打鍵感と音の感じが好みではなかったのでボツ。 横に置いてあったこっちのキーボードを触ってみたらかなりしっくりきた。他にも色んなキーボード(同モデルの静音タイプとか)が置いてあったけど、長いこと使うなら手に馴染むモデルが良いと思ってそのまま購入という流れ。 あと、個人的には気にならなかったけど、色んなところのレビューを見る感じ音に敏感な人と同居してるとか赤ちゃんがいる家庭とかだと少し苦情が出るかも、なくらいの音が出るのでそこは注意すべき。多分そういった人向けに静音モデルがあると思う。 Bluetooth接続できるデバイスの数が多め これもかなりポイント。仕事用のPCにもプライベート使っているPCも両方ともクラムシェルモード(PCを折りたたんだまま外部ディスプレイに接続して使用するモード)で使っているので、仕事を始めるタイミングや終えて切り替えるタイミングで物理ケーブルの切り替えに手間が掛かるのが嫌だった。 HHKBを使用する前に使用していたMagic Keyboardなんかは複数デバイスに対応していなかったため、いけてないなと思いつつ使っていた。 今はコマンドで接続先を切り替えるだけなのでそのストレスは大きく減った。お高いキーボードであれば標準的に乗っている機能なんだろうけど、なんでMagic Keyboardはこの機能がないんだろう・・・ 良くないところ 割と頻繁な頻度で単三電池...

Pythonでリストの中から被っている値を見つけよう!!LeetCodeの解法例あり

リストの中から被っている値を見つけよう!!

という話。

見つけてその値を削除するなり、被っている値の数を数えるなり、被っている値は何なのかを返すなりは別にいいとして、個人的な方法をメモ代わりに取っておく。

基本

今回は考えやすいようにLeetCodeの問題を例に考えてみます。

問題

例えばこちら。
287. Find the Duplicate Number

難易度はMediumです。

問題としては与えられた数字のみのリストの中に1つだけ2つ存在する値があるのでそちらを探して欲しいという問題です。
例としては以下のような感じ。

Example 1:

Input: nums = [1,3,4,2,2]
Output: 2

Example 2:

Input: nums = [3,1,3,4,2]
Output: 3

Example 3:

Input: nums = [1,1]
Output: 1

Example 4:

Input: nums = [1,1,2]
Output: 1

解法

改良前

これの解放としてパッと思い浮かぶものとしては、二つのfor文で二つの値を比較しながら被っている値があれば行いたい処理を行う、というもの。

ただ、与えられたリストがソートされていないのでまずソートしないとその比較はできなくなります。

試しにPython3で書いてみました。

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        ans = 0
        nums = sorted(nums)
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i] == nums[j]:
                    ans = nums[i]
        return ans
# Time Limit Exceeded

計算量はO(n^2)です。

試しに実行してみましたが、これでは時間切れです。

改良後

ではどうするのか?
この上のコードを少し改良するだけで実は計算量を大きく改善できます。

それが以下のコードです。

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        if not nums:
            return
        ans,index = 0,1
        nums = sorted(nums)
	    for i in range(1,len(nums)):
	        if nums[i] == nums[index-1]:
	            ans = nums[i]
		    else:
		        index += 1
        return ans
# Runtime: 68 ms, faster than 55.74% of Python3 online submissions for Find the Duplicate Number.
# Memory Usage: 16.6 MB, less than 78.10% of Python3 online submissions for Find the Duplicate Number.

二重for文の後のfor文を事前にインデックス値として宣言します。

for文の中で仮に値が被っていなければインデックスの値を1プラスするだけ。
被っていれば値をansに追加してインデックスの値を1プラスする。

これだけで計算量がO(n)になります。
そしてO(n^2)だと時間切れだったものが通るようになります。

こんな感じです。
単純な工夫ですが、これだけで計算量を削減できるので手軽に使えますね。

今回のメモはこんな感じ。

コメント

このブログの人気の投稿

【OSLog】How to log a Swift project

Principles of UX/UI Designでこんなことを学んでいるよ 第一週 User-centerd design①

Swiftで使うQueueのテンプレート