字符串匹配,Leetcode 28,KMP算法

最近在做Leetcode,遇到有關字符串匹配的如下題目: 28. Find the Index of the First Occurrence in a String 要求從haystack 字符串裡找是否包含needle字符串,並找出首次出現位置。比如sadbutsad裡是否包含sad字符串。 發現除了暴力循環解法外,還有神奇的KMG算法可以把複雜度從O(m*n)簡化為O(m+n)。雖說大家都說用處不大,但是還是覺得很有意思,於是花了點時間學習,順便寫這篇文章記錄一下。 ...

2023-09-05 · Ariel

Gitlet design document

This is the design document for Gitlet project. Classes and Data Structures Main This is the entry point to Gitlet program. It takes in arguments from the command line and based on the command (the first element of the args array) calls the corresponding command in GitletRepository which will actually execute the logic of the command. It also validates the arguments based on the command to ensure that enough arguments were passed in. Fields This class has no fields and hence no associated state: it simply validates arguments and defers the execution to the `Gitlet`Repository class. Blob GItlet, like Git, is a content-addressable filesystem. Even one byte change in content will lead to a totally different blob object. To accomplish this, Blob class implements Serializable to save each different file content as blob object for future retrieve. Fields All the following instance variable will be serialized. ...

2023-06-15 · Ariel

用Java寫個簡單的Git:CS61B Gitlet項目筆記

在寫Git 原理學習筆記的時候,就有考慮要不要跟著網上的教程:Write yourself a Git! 用Python寫個或者是照抄一個Git,但是當時不會I/O的處理,就先放棄了。沒想到CS61B的其中一個Gitlet項目就是用Java寫一個簡單版本的Git(包含checkout,merge,reset等),就試試看吧。 其實自己OOP的理解和I/O的處理都還不是很會,Java也是剛學,CS61B才學了一半,要自己手寫個Git,頗有難度,非常考驗耐心。不過這個項目有種魔力,一旦開始就很難放棄,所以我才能中途沒有放棄。(之前學CS50做tidman,覺得太難,我獲得70分後就放棄了) ...

2023-06-13 · Ariel

Java 和 Python 的區別

最近開始學Java,感覺和Python蠻不一樣,於是在網上找找資料,看看二者的不同之處。 先分享一篇好玩又很有啟發的文章: 两年,我学会了所有的编程语言! 下面進入正題。 Java是編譯式的語言, Python是直譯式的語言? 想要清楚這個問題,要稍微了解下二者的程序是如何運行的。 Python是怎麼運行的? 來源:is-python-a-compiled-language-or-an-interpreted-language 比如helloworld.py文件。如下是比較常見的運行方式: 使用interpreter(比如CPython),解釋器第一步將原代碼編譯(compile)為“byte code”。byte code和machine code區別在於前者是跨平台性的。 ...

2023-04-07 · Ariel

Git 原理學習筆記

之前學CS50W的時候學過一些Git指令覺得不好理解,這次開始CS61B課程之前又再次需要用Git。既然無可避免,那就花些時間試著了解看看git到底是什麼。 注:本文為初學者學習筆記,請謹慎參考。 名詞解釋: hash function,給予內容(value),通過hash function產生某種key,形成key和value的對應關係 ...

2023-02-18 · Ariel

9種方法寫Fibonacci(Python)

受A Python Guide to the Fibonacci Sequence啟發,我也來試試看用CS61A課程所學寫Fibonacci,感覺又好玩,又可以順便複習下課程。是的,好的課程一定要花些時間好好複習。 Fibonacci是什麼? Fibonacci,翻譯為斐波那契数。 請參考如下維基百科的定義。 source:Fibonacci number 維基百科中文版也有不同語言版本的程式參考: https://zh.wikipedia.org/wiki/斐波那契数#程式參考 ...

2023-01-18 · Ariel

CS61A 學習筆記和心得4-Tail Call

注:本文部分引用代碼來自CS61A(Structure and Interpretation of Computer Programs) Scheme作業,請小心劇透。個人學習筆記,請小心參考。 上一篇筆記提到了Read-Eval-Print-Loop,這篇筆記記錄其中的附加題-tail call optimization。 尾調用(tail call) 在计算机学裡,尾调用(tail call)是指一个函数里的最后一个动作是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接被当前函数的返回结果。 ...

2023-01-11 · Ariel

CS61A 學習筆記和心得3-通過學習用Python寫個Scheme Interpreter來學習編程語言

注:本文引用代碼來自CS61A(Structure and Interpretation of Computer Programs) Scheme作業,請小心劇透。個人學習筆記,水平有限,請小心參考。 心得: 本來我想學Scheme版本的CS61A,弄了很久環境都沒有設置成功,然後轉學Python版本的CS61A。 沒想到課程第三章是先用一個python寫的解釋器學Scheme,不用下載任何東西。然後作業是自己一步一步寫一個Scheme語言的解釋器,每完成一步還可以自己運行看看。完成作業後,我們自然了解到這個解釋器的程式也就這樣而已嘛,不難懂啊,沒什麼神秘的。 ...

2023-01-05 · Ariel

CS61A 學習筆記和心得1:Python 函數式編程/遞歸

CS61A(Fall 2022)第一部分的課程在介紹函數式編程,對應課本第一章,主要包含: 高階函數Higher-Order Functions 遞歸(一直call自己循環的函數) 也簡單帶過如下內容 Lambda( 匿名函數) Currying(只有一個argument的一串函數) Decorators(函數裝飾器,高階函數的替代) 提示:本文參考課本所寫的筆記,方便自己以後複習,舉例含有部分作業代碼,要上課的同學請不要閱讀。 ...

2022-10-25 · Ariel

從0和1開始造一台電腦3-電腦如何記憶

註:本文為From Nand to Tetris 課程學習筆記,目的為總結個人所學。如有點閱,請謹慎參考。 前一篇文章(總結了電腦如何計算,但是電腦光是計算還不夠,還需要有時間的概念和記憶的能力。 如果我們要用loop計算1+2+3+4,我們就要先設定一個sum,讓sum=0,還要有用(i=0;i<4;i++)來loop,然後計算: ...

2022-09-13 · Ariel

從0和1開始造一台電腦2-電腦如何運算/2補數/加法器/ALU

註:本文為From Nand to Tetris 課程學習筆記,目的為總結個人所學。如有點閱,請謹慎參考。 人類是高等動物,具有邏輯思考能力,所以我們使用文字和阿拉伯數字來傳遞信息。 但是有很多場合,當無法用文字和數字來處理信息時,也會用二進制來傳遞或處理信息。 二進制是最簡單的溝通語言 比如: 烽火 烽火有兩種狀態,點燃為1,表示有敵人來犯;沒點燃為0,表示沒有敵人。所以總共有2^1=2種。 ...

2022-09-12 · Ariel

從0和1開始造一台電腦1-邏輯門

在學習CS50wk0的時候有學到電腦最底層都是一堆的0和1,當時就產生一堆的好奇心。感嘆每天自己使用的電子產品竟然都是從0和1這麼簡單的開和關一步步構造出來的。 所以在看到Nand2tetris part1課程號稱從NAND邏輯閘開始造一台可以跑簡單程式的電腦時,沒多想就開始上課了。 上完了前五章,我從一開始連Nor這種邏輯門都不能理解的人,看書然後跟著課程,慢慢從簡單的邏輯門開始,用模擬器構造出RAM/register/ALU,最後做出CPU。這個過程使用教授專門為了課程設計的硬體模擬語言HDL,在老師的指導下通過5週的作業做出了簡單的HACK電腦。不是真的連一堆電線,而是用模擬的方式學習背後的邏輯。 ...

2022-09-10 · Ariel

我為什麼學習電腦科學(從CS50開始)

1月的時候寫了篇文章,寫了為什麼學習Python,文科生為什麼學Python? 現在學完了CS50 哈佛大學的電腦科學入門導論課程 後,我想學習的不僅僅是Python了,被挖了很多坑想學習,比如演算法、計算機網絡、高等數學等等。 1.減少mind wondering 如果沒有很專注的工作或者學習的話,很容易胡思亂想。 在家帶小孩沒有明確的任務,空閒時間就很容易mind wondering。 ...

2022-06-20 · Ariel

CS50 wk8 TCP,IP,HTTP,HTML,CSS,JavaScript課程筆記

本週學習: TCP(Transmission Control Protocol) IP(Internet Protocol) HTTP(HyperText Transfer Protocol) DNS(Domain NameS) HTML CSS JavaScript DOM 本週課程前面40分鐘講解了Computer Networking相關知識,教授用傳輸信件這個方式來形象的解釋了互聯網是如何傳輸信息的。 在2016年的wk6課程中,教授是用google網上的信息這個例子來說明信息是如何傳遞的。其中還有一個動畫短片Warrior of the Net形象的說明信息是如何傳遞的。 ...

2022-05-18 · Ariel

CS50 wk7 SQL學習心得

學習心得: 本週學習SQL,處理數據庫的語言,句法簡單。主要的句法參考下面兩個網站。 SQL Keywords Reference https://www.sqlstyle.guide 為什麼不寫筆記? 1.可以google 2.細節內容太多太費時間 3.可以通過code練習 4.理解概念之類的可以做筆記。 不過這個對於初學者很難,比如OOP這個概念,我也沒有完全弄懂。想要用自己的話寫出來,無形中逼迫自己學習更多思考更多。為了了解什麼是OOP,我看了很多視頻和文章,但是只有大概的感覺,還沒有徹底懂,所以我還沒辦法用自己的話寫出來。 ...

2022-04-23 · Ariel
  | Copyright © -2025 Everydaydiva's Blog