Cindy's Blog

アマゾンで働いているエンジニアの日常

LeetCode 22. Generate Parentheses

https://leetcode.com/problems/generate-parentheses/

問題を分析する、可能な範囲でオーダーを減らす

class Solution {
    public List<String> generateParenthesis(int n) {
        //1 -> "()"
        //2 -> "(())", "()()"
        //3 -> "()()()", "(())()", "()(())", "((()))", "(()())"
        
        //invalid: ")))(((", "))(())" ...etc
        
        // policy1: generated all possible and check each case
        // policy2: when add a ')', then check balance with '(' 
           //want to avoid ')(' or '())()'
           //number of ')' is never bigger than '('
        //since policy 1 has more complicated time complexity, we take policy2
        
        List<String> answer = new ArrayList<>();
        findAnswer(n, 0, 0, new StringBuilder(), answer);
        return answer;
    }
    
    private void findAnswer(int n, int start, int end, StringBuilder current, List<String> answer){
        if (start == end && end == n){
            answer.add(new String(current));
            return;
        }
        
        //take start
        if (start < n){
            current.append("(");
            findAnswer(n, start + 1, end, current, answer);
            current.setLength(current.length() - 1);
        }
        
        if (end < n && end < start){
            current.append(")");
            findAnswer(n, start, end + 1, current, answer);
            current.setLength(current.length() - 1);
        }
    }
}

LeetCode 39 Combination Sum

https://leetcode.com/problems/combination-sum/

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        //pick one element unlimited times => make up sum equals to target
        //broute force find target
        
        List<List<Integer>> answer = new ArrayList<>();
        List<Integer> current = new ArrayList<>();
        
        findCombinationSum(candidates, target, 0, 0, current, answer);
        return answer;
        
    }
    
    private void findCombinationSum(int[] candidates, int target, int sum, int index, List<Integer> current, List<List<Integer>> answer){
        if (sum > target){
            return;
        }
        if (sum == target){
            answer.add(new ArrayList<>(current));
            return;
        }
        
        for (int i = index; i < candidates.length; i++){
            current.add(candidates[i]);
            
            //not i + 1 since we can reuse the candidate
            findCombinationSum(candidates, target, sum + candidates[i], i, current, answer);
            
            current.remove(current.size() - 1);
        }
    }
    
    //2,3,6,7  sum 0
    //^.       sum2
    //  ^.     sum3
    //.   ^.   sum6
    //.     ^. sum 7 =>answer
    //^x2.     sum 4
    //. ^x2.   sum 6
    //^.^      sum 5
    //^x2^.    sum 7 => answer
}

LeetCode 78 Subsets

Select and not game

//select or not game!
//if nums.length = n
//then you have 2n options
//[1,2,3] => 23 = 8 sets

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        //select or not select game!
        //if nums.length = n
        //then you have 2^n options
        //[1,2,3] => 2^3 = 8 sets
        
        int size = nums.length;
        List<List<Integer>> answer = new ArrayList<>();
        List<Integer> current = new ArrayList<>();
        findSubsets(nums, size, 0, current, answer);
        
        return answer;
    }
    
    private void findSubsets(int[] nums, int size, int index, List<Integer> current, List<List<Integer>> answer){
        
        if (index == size){
            answer.add(new ArrayList<>(current));//deep copy
            return;
        }
        
        //not select
        findSubsets(nums, size, index + 1, current, answer);

        current.add(nums[index]);
        findSubsets(nums, size, index + 1, current, answer);
        //backtrack
        current.remove(current.size() - 1);
    }
}

LeetCode 46. permutation

https://leetcode.com/problems/permutations/submissions/

find first element game !
//[1,2,3]
// 1 -> 2 -> 3
// -> 3 -> 2
// visited or not visited?
// 2 -> 3 -> 1
// 1 -> 3
// 3 -> ...

class Solution {
    public List<List<Integer>> permute(int[] nums) {        
        List<List<Integer>> answer = new ArrayList<>();
        List<Integer> current = new ArrayList<>();
        boolean[] visited = new boolean[nums.length];
        findPermutation(nums, current, visited, answer);
        
        return answer;
    }
    
    private void findPermutation(int[] nums, List<Integer> current, boolean[] visited, List<List<Integer>> answer){
        //found one of the answer
        if (current.size() == nums.length){
            answer.add(new ArrayList<>(current));//deep copy
            return;
        }
        //find first element
        for (int i = 0; i < nums.length; i++){
            if (visited[i] == true){
                continue;
            }
            
            current.add(nums[i]);
            visited[i] = true;
            findPermutation(nums, current, visited, answer);
            //back tracking
            current.remove(current.size() - 1);
            visited[i] = false;
        }
    }
}

「1日5分からの断捨離」の読書記録

書籍との出会い

引越し作業により自分のものが多いなと感じたため、コツよく整理したいと思いました。 ちょうど新宿の紀伊國屋書店でおすすめコーナーにあったため購入しました。


全体のあらすじ

基本的に、家のものを「扱い方」をわかりやすく説明くれました。 ものを選ぶときに「要・適・快」の条件に全部満たした上で購入することが前提。

本書はほとんど箇条書きなので、とても読みやすくだけでなく、 自分にルールに作りながら、自分のことを大切にしていく気持ちになるので、読み心地もとてもいいです。


いつか心に響いた言葉を書いておきます

ここで、自分の心に響いた言葉を書きたいと思います。

一日たった5分の断捨離

断捨離、基本の3ステップは、①ゴミ袋を用意する ②いらないものをゴミ袋に入れる ③ゴミ袋を家の外に出す


「断捨離をする・しない」では、あなたの人生にとって天と地の差がある。

「断捨離をする・しない」では、あなたの人生にとって天と地の差がある。


断捨離は人生をつくり

住空間が心の状態をつくり、身体の状態をつくり、人間関係をつくり、人生をつくっていくからです。


断捨離により時間が増える

物が減ることから、自分の時間が増える


「今、履きたい靴を3足」、「今、着たい服を5着」、「今、一緒に歩きたいバッグを3つ選ぶ」

今に注目して、現在必要なものだけ使う


ゴミ箱として、大きめな紙袋、小さめな紙袋を使用

ゴミ箱の数をが多いほど、管理が大変


机の上のモノを取り除く

書斎は思考の場。 書類の山、文房具、デジタル機器があればあるほど、作業スペースが狭くなるのはもちろん、 情報に振り回されることになる。


水平面に物を置かない

この言葉を唱えながら、机の上に取り組んでみてください。


トイレに香りを漂わせる

自分もしくはお客さんのために、空間に香りを足します。


「賞味期限」をチェックする

冷蔵庫の中、食べたくないものに「ごめんなさい」して「さようなら」しよう。


キチンの家電を一つピカピカする


マイブームが終わったら潔く手放ししよう

「また、マイブームが来たらどうしよう?」
大丈夫。次のマイブームが来たときに、市場のキッチン家電は新しくなっている。 電化製品の進化が早いのだ。 性能がアップグレードされているし、デザインも変わる。


スポンジを交換する

スポンジは「キレイ」の象徴であり、雑菌の繁殖場。 キッチンのシンクのスポンジを頻繁に交換しよう。 作者は一週間サイクルにしている。


読書感

この本に、教養用の本もしくはツールの本としてどちらも使えます。


部屋に溜まっているものをどうして、 「あるある思考」と「ないない思考」に変化するのに影響を与えるのかも説明しています。


私がこの本を買った理由は、ただ家のスペースを作りたくて、 おしゃれで保てたかっただけです。

色々なルールを作り、身につけたいと思っています。


ぜひ、自分の家にあるものを、「断捨離」してみませんか?



「なぜか話しかけたくなる人、ならない人」の読書感

書籍との出会い

渋谷の書店で本書を読んでみたら利用できるような内容だったので購入しました。読みたい動機は、4月から社会に出て、新社会人になるため、まずは好印象を残したいと思います。学生時代では、他人に心が開いていなかったことに気付き、状況を改善したいのも本を読みたい理由の一つです。


本書は、amazonからでも入手できます:


全体のあらすじ

この本では、あらゆるシーンを例として挙げられ、「話かけたくなる人」と「そうならない人」の分け方をあげて、他人にどのような印象が残るかを説明する。

そこで、自分の言動を思い比べできるようになり、改善できるところがわかってきます。


印象に残ったシーンの紹介

ここで、いくつ面白いと思ったシーンを紹介したいと思います。



ちょっとした「変化」がある人には、話かけやすい

変化に気づいてもらえることは、「あなたをちゃんとみてますよ」と言われているようなもの。自分の存在を認めてもらっている証になります。ので、変化に気づいてもらうためには、"自分"が相手のちょっとした変化に気づくようにします。


できるだけ「素の自分」で接する

ほんとに素の自分で接していいのかを心配する人もいますが、離れていく人もいれば、興味をもってくれる人も出てきます。効果的な方法は、「自分は〇〇タイプです」と宣言することです。逆に、自分の欠点や弱みに対して「X」を出しているから、自分に振る舞えないです。素の自分を出すことにより、相手からすると「心を開いてくれている」と思われます。


なんでもいいから「褒める」

まず、人の弱点というものか、どんな人でも、自分のことを認めて欲しいと思っています。また、褒め上手な人と言うのは、気負うことなく、素直に「いいな」と思った週間、口にしている人です。「それ、いいね」「すごーい」「お、さすが!」「頑張ってる」「尊敬・・・・」といった簡単な言葉でも感情をこめて言うと、相手は素直に喜んでくれるはず。


「自分から話かけない人」にならない

人に興味あることを示しましょう。


「批判ばかりする人」にならない

  1. 言いたいことの半分以下にして批判する。全部言ってしまうと、しつこくなりがち。

  2. 明るい表情と口調で愚痴る。「嫌になっちゃいますねー」と行っても、深刻な印象になりません。

  3. ポジティブに閉める。最後に「あの人にもいいところがあるけどね」とフォローしたり、「まあ、頑張ります!」と前向きに締めて終われば、爽やかな印象に残ります。


初対面の人にすぐに共通点を見つける

「同性である」「髪が長い」「似た体型」「同じものを飲んでいる」「出身地が近い」「同業者」「趣味が同じ」などの共通点は、会話の"呼び水"。大事なので、何かしら接点を見つけるようとする気持ちです。


職場では、年上を尊重して、頼る

そもそも職場の人たちは、同じ目的をもって「同志」のようなものです。年上と付き合うヒケツは「怖がらない」「戦わない」「比べない」という気持ちをベースにもって、「尊重して、頼る」に尽きます。


職場では、「言うのはここまで」という線引きをする

言うことのラインを引くのは、相手に対する思いやりであり、マナーなのです。以下のように、言うのはここまでのラインを引くためには、次のような「自分ルール」をもつことです。

  • 「お金」「恋愛」「家庭の事情」など、話さないことを決めておく。

  • 「ここだけの話」をしない。全員いん知られてもOKのことだけ話す

  • できるだけゆっくり話て、迷ったら引っ込める。(焦っているときには、判断力が鈍ってついペラペラと口が滑ってしまうもの。ゆっくり話すと、冷静に「ん? これって言うべきこと?」と危険察知センサーが働きます。)


「相手に対する気づき」を口にする

「あれ?今日は早いですね」
「お、字が綺麗ですね」
などを口にするだけで「そうですか?」「わかりました?」と言いつつも、気づいてくれたことを嬉しく思うはずです。”気づき”というのは、「あなたのことを認めています」「気にかけています」というイメージになりますから。


相手に対する気づきポイントは「見た目」と「行動」から着手できます。 見た目:「春っぽいコートですね」「今日は荷物が多いですね」「そのバック、使いやすそう」「素敵な靴」「いい笑顔」「お洒落なメガネ」などの形容詞をつけると、褒め言葉に。「そういうの好きです」「センスを学びたい」など感想を加えるとさらに嬉しい言葉です。
行動: 「最近、忙しそうですね」「これから休憩ですか?」「気が利きますね」。ただし、やりすぎは禁物。監視されているように感じるので、時々さらりと。魔た、当然ですが、相手に歓迎される気づきであること。間違っても「あ、白髪・・・・」「あ、太った」など、礼儀として口にしないでおきましょう。


思ったこと

個人的に、自分から人に興味を持つ、平易な態度を持つ+少しテクニクで十分だと思います。 テクニクを使いすぎてしまうと、例えば本書に書いている項目を全て無理やりに身に付けてしまうと、個性がなくなる可能性もなくもありません。 自分が今一番感じているところ、困っているところ、なんとかすぐ改善したいところだけすぐに利用することは本書の目的ではなかと考えています。


読書前と読書後の心境の変化について

まず、初対面の人でも一期一会を楽しめることができるようになりました。好きな人ができたときにも、まずはいい印象を与えることに意識し、簡単な言葉でも喜ばせるようになって、二人だけのときを心から楽しむことでき。そこれ今までの自分を比べてみると、自分の些細な変化に喜びを実感しました。
「話かけたくなる人」は、とくしていることを分かるようになり、「私はこういう意味だったのでなぜ向こうがわかってくれないんだ」という誤解は、生活の中から段々少なくなっていきます。そこから人生に向ける態度も変わります。


既卒の就職心得(2020年)

背景

2020年3月修士課程終わることで、元々は去年から就職活動をすべきだったのですが、修士論文やスケージュールの噛み合いが悪く、また元々インターンしていた会社との話がうまくいかず、修士課程が終わる直前、つまり2月下旬から就職活動を始めました。

履歴は以下になります:
学歴:早稲田大学基幹理工学部卒、GPA:2.99
   早稲田大学基幹理工研究科修了、GPA:3.73
語学:中国語(母語)、日本語(N1)、英語(TOEIC:830)


予め自己紹介になりますが、私は日本の出身ではなく、台湾の出身です。よって、日本での一括採用の事情、さらに既卒といった身分で、日本で仕事を探すことは想像以上難しいことを予め痛感しました。外国人は、ビザの事情があるため、少しでも行動が遅いと帰国しざるをえない状況になりますので、このブログを読んでいる方が日本で就職する時に特に注意して欲しいです。


ここは、私がエントリーしていた会社、参加したイベントなどの印象、そして考えたこと記録をします。私がエントリーしていた会社に興味ある方は、少しでも参考になればと思います。


エントリーしていた会社

ソニー(グループ会社も含め)、フューチャーアーキテクチャ、日立ソリューションズ、OpenHouse、ビズリーチ、株式会社ジーニー、アクセンチュア(Accenture)、NTTドコモナビータイム、キャノン、野村総研(NRI)、リクルート、LIFULL(ライフル)、PWC、Line、SBテクノロージ、ソフトバンク日立製作所トヨタ製作所、ドワンゴマイナビKDDI、NTT研究所、楽天株式会社、コナミ (KONAMI)、DeNA富士通、シャープ、三井不動産三菱地所、イーソル 、パナソニック、シンプレクス 、グーグル、SalesforceIBMmixiWestern Digital
計:36社


既卒でエントリーさえできなかった会社:

Amazon (AWS), Microsoft, スクウェア・エニックス, Huawei, ゴールドマン・サックス(Goldman Sachs)

計:5社

正直、本当に行きたかった会社は外資系であって、エントリーする資格さえなかったことにとても苦しく感じていました。


結果

内定:ソフトバンク(と他の3社)
途中辞退:5社 (理由:面接の時に会社の雰囲気に対する印象を悪く感じたため)


就職サイト&イベント:

アカリクのイベント、そして就職エージェントを利用していました。 また、Connect Jobも利用していました。

Connect Jobから紹介できる会社の質は正直いまいちです。アドバイスとしてはあまり時間をかけない方がいいと思います。

アカリクの就職エージェントは、プロの方がサポートしてくれる他、紹介する先の質はまあまあいい会社だという印象でした。

他に、「外資就活(コミュニティ利用)」、「One Career(エントリーシード参考用)」サイトを利用していました。


心得:

まず、日本の新卒一括採用はとても感じ悪いと思っていました。一括採用は、世界中はおそらく日本しかやっていないでしょう。国にいる家族に対する、日本の制度の説明はたくさん時間をかけていました。それに加、コロナ禍のせいで、「既卒で仕事を探すことは想像以上に難しいこと」を、これから就職活動を行う人に対するアドバイスでした。早めに動き出してください!