投稿

ゼロから始めるLeetCode Day81 「347. Top K Frequent Elements」

概要 海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。 どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。 早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。 と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。 ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。 Leetcode Python3で解いています。 ゼロから始めるLeetCode 目次 前回 ゼロから始めるLeetCode Day80「703. Kth Largest Element in a Stream」 次回 ゼロから始めるLeetCode Day82「392. Is Subsequence」 Twitter やってます。 問題 347. Top K Frequent Elements 難易度はMedium。 前回の問題同様Heapを使った問題です。 問題としては、数字が格納された空ではない配列が与えられます。その配列の中から K 番目まで頻出の要素を返すようなアルゴリズムを設計してください、というものです。 Example 1: Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2] Example 2: Input: nums = [1], k = 1 Output: [1] 解法 Counter を使ってリストの要素を調べ、keyを取得、そしてheapの nlargest を使って書きました。 import heapq import collections class Solution : def topKFrequent ( self , nums : List [ int ] , k : int ) - > List

デザインパターンについて学ぶなど。

今更かもしれないが デザインパターンの本を持っていて、一通り読み進めたが、ふと思い出した時にあれってどんな実装方法だったっけ?となりがちなので改めて読んで概念を理解した上で写経してあー。こんな感じだったなぁと思いつつひたすら手を動かす。 以前読んでいた時(Javaについて学び始めの頃)は、とにかくインプットが欲しくていろんな本を読みあさっていたが、やはり勉強と同じで概念をしっかり理解して定着させるためにはただ読みあさり続けるだけではなくて、こうした形で何かしらの記事にしたり、実際に手を動かすことが何より近道だとひしひしと感じている。 技術者なんだったら困った時に調べればいいじゃん!という考え方も頭の片隅にはあるが、それには限度があって、実際に何かしらの技術が好きでやっているならば調べなくてもできる範囲を増やしていくべきだと思うし、何より楽しんでやれるならそれは勉強ではなく、これは遊びであるという認識に近い。 なのでゲームや最近ハマっている麻雀、漫画やアニメを見るなどの娯楽と大して変わらない。とても楽しくやれている。 しかしあまりにも技術が多すぎてどういうことをメインに学ぶべきか、という問題はある。 メインに据えるべきは相対的に知識が陳腐化しにくいCSの分野ではあると思う。 いくつか理由があるが、一番メインの理由は僕が情報系の学部を卒業していないからだ。 これは技術者として明らかな差が生じる要因で、データ構造やアルゴリズムといった基本的な概念すら専門的に学んでいないのだ。 なのでそういった人たちとの差を埋めるためにどこかで4年間の差を取り戻さなければならない。そのために一般的な情報系学部の大学生が買うようなCSの教科書(論理回路やOS、アーキテクチャなど)を買って勉強しているが、昔中学高校の理科の授業で習った時よりすんなり入ってくる。やはりこれも進んで勉強しているからなのだろうか。 それに伴って記事を書いているのが「ゼロから始めるLeetCode」で、データ構造とアルゴリズムは最近は日系企業でもコーディング面接が多く行われ始めているので、最初に対策すべきだろうと感じて書き始めた。 ただ、それ以外にもまだまだ穴は多く、ネットワークやセキュリティなどを端的に説明してくださいとなると言葉に詰まるし、恐らく覚えている量も他の技術者に比べて相対的に少ない。 確かにすぐに年収など

ゼロから始めるLeetCode Day80「703. Kth Largest Element in a Stream」

概要 海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。 どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。 早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。 と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。 ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。 Leetcode Python3で解いています。 ゼロから始めるLeetCode 目次 前回 ゼロから始めるLeetCode Day79「1282. Group the People Given the Group Size They Belong To」 次回 ゼロから始めるLeetCode Day81 「347. Top K Frequent Elements」 Twitter やってます。 #問題 703. Kth Largest Element in a Stream 難易度はEasy。 問題としては、ストリーム内の k 番目に大きい要素を見つけるクラスを設計してください.これは、ソートされた順番の中で k 番目に大きい要素であって、 k 番目の異なる要素ではないことに注意してください。 KthLargest は、整数 k とストリームの初期要素を含む整数配列 nums を受け入れるコンストラクタを持ちます KthLargest.add メソッドを呼び出すたびに、ストリーム内の k 番目に大きい要素を表す要素を返します。 Example: int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3); // returns 4 kthLargest.add(5); // retu

ゼロから始めるLeetCode Day79「1282. Group the People Given the Group Size They Belong To」

概要 海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。 どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。 早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。 と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。 ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。 Leetcode Python3で解いています。 ゼロから始めるLeetCode 目次 前回 ゼロから始めるLeetCode Day78 「206. Reverse Linked List」 次回 ゼロから始めるLeetCode Day80「703. Kth Largest Element in a Stream」 Twitter やってます。 問題 1282. Group the People Given the Group Size They Belong To 難易度はMedium。 問題としては、 0 から n - 1 までのIDを持つ人が n人 存在し、それぞれはちょうど1つのグループに所属しています。各人が所属するグループのサイズを示す長さ n の配列 groupSizes が与えられた場合、グループの数と、各グループに含まれる人の ID を返します。 任意の解を任意の順番で返すことができ、 ID についても同様です。また、少なくとも一つの解が存在することが保証されています。 Example 1: Input: groupSizes = [3,3,3,3,3,1,3] Output: [[5],[0,1,2],[3,4,6]] Explanation: Other possible solutions are [[2,1,6],[5],[0,4,3]] and [[5],[0,6,2],[4,3,1]]. Exam

ゼロから始めるLeetCode Day78 「206. Reverse Linked List」

概要 海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。 どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。 早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。 と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。 ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。 Leetcode Python3で解いています。 ゼロから始めるLeetCode 目次 前回 ゼロから始めるLeetCode Day77「1502. Can Make Arithmetic Progression From Sequence」 次回 ゼロから始めるLeetCode Day79「1282. Group the People Given the Group Size They Belong To」 ( https://twitter.com/kueharx )やってます。 問題 206. Reverse Linked List 難易度はEasy。 問題としては、与えられた単方向の連結リストをそのままひっくり返すというものです。 Example: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL 解法 とりあえずiterativeなものを。 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution : def

ゼロから始めるLeetCode Day77「1502. Can Make Arithmetic Progression From Sequence」

概要 海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。 どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。 早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。 と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。 ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。 Leetcode Python3で解いています。 ゼロから始めるLeetCode 目次 前回 ゼロから始めるLeetCode Day76「3. Longest Substring Without Repeating Characters」 次回 ゼロから始めるLeetCode Day78 「206. Reverse Linked List」 Twitter やってます。 #問題 1502. Can Make Arithmetic Progression From Sequence 難易度はEasy。 最近追加された新しめの問題です。 Easyっぽくない問題なので是非解いてみてください。 問題としては、数の配列 arr が与えられた時、連続する2つの要素間の差が同じであれば,数列は算術進行と呼ばれます。 配列を再編成して算術進行を形成できる場合は true を返し,そうでない場合は false を返してください。 Example 1: Input: arr = [3,5,1] Output: true Explanation: We can reorder the elements as [1,3,5] or [5,3,1] with differences 2 and -2 respectively, between each consecutive elements. Example 2: Input: arr =

ゼロから始めるLeetCode Day76「3. Longest Substring Without Repeating Characters」

概要 海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。 どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。 早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。 と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。 ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。 Leetcode Python3で解いています。 ゼロから始めるLeetCode 目次 前回 ゼロから始めるLeetCode Day75 「15. 3Sum」 次回 ゼロから始めるLeetCode Day77「1502. Can Make Arithmetic Progression From Sequence」 Twitter やってます。 問題 3. Longest Substring Without Repeating Characters 難易度はMedium。 問題としては、文字列が与えられたとき、文字を繰り返さずに最長の部分文字列の長さを求めなさいというものです。 Example 1: Input: “abcabcbb” Output: 3 Explanation: The answer is “abc”, with the length of 3. Example 2: Input: “bbbbb” Output: 1 Explanation: The answer is “b”, with the length of 1. Example 3: Input: “pwwkew” Output: 3 Explanation: The answer is “wke”, with the length of 3. Note that the answer must be a substring, “pw