資料結構 - 字串

jsliang發表於2019-09-16

Create by jsliang on 2019-8-22 07:41:30
Recently revised in 2019-09-16 19:39:15

陣列 - 最簡單的記憶體資料結構。

字串 - 隨時可以轉換成數字或者陣列的簡單型別。

重點推薦:String - MDN

jsliang 的聯絡方式盡在 jsliang 的文件庫github.com/LiangJunron…

一 目錄

不折騰的前端,和鹹魚有什麼區別

目錄
一 目錄
二 前言
三 字串的儲存結構
四 字串的常用知識點
4.1 字串 - 查詢
4.2 字串 - 正規表示式
4.3 字串 - 修改
4.4 字串 - 轉型別
4.5 字串 - 大小寫
4.6 字串 - 去空格
五 LeetCode - 字串訓練
六 總結

二 前言

返回目錄

什麼是字串?

字串是有零個或者多個字元組成的有序數列。

如果字串的個數為零,則表明這個字串為 空串(Null String),長度為 0。空串表示為:''

如果字串由空格組成,那麼它就不是空串,而是有 n 個空格長度的字串,例如:' '(它包含了一個空格,所以長度為 1)。

空串和 n 個空格組成的字串

const nullString = '';
const spaceString = ' ';
console.log(nullString.length); // 0
console.log(spaceString.length); // 1
複製程式碼

為什麼要引入這個概念呢?

因為在一些場景,你需要知道這個字串是否為空,從而做某些判斷。

例如:

在這題中,就需要判斷它是否為空串,如果為空串則返回 0:

var strStr = function(haystack, needle) {
  if (!needle.length && !haystack.length) {
    return 0;
  }
  if (!needle.length) {
    return 0;
  }
  // ... 程式碼省略
};
複製程式碼

同時,通過這題,我們還可以引入 子串 的概念:

給定一個 haystack 字串和一個 needle 字串,
在 haystack 字串中找出 needle 字串出現的第一個位置 (從 0 開始)。
如果不存在,則返回 -1。

示例:

輸入: haystack = "hello", needle = "ll"
輸出: 2
複製程式碼

在這裡,hello 就是 ll 的主串,llhello 的子串。

如果你初中數學還不賴,那麼你大概可以將 ll 當做是 hello 的子集。

到這裡,我們開始瞭解到字串的一些點,如果你覺得還可以接受,請繼續往下看。

三 字串的儲存結構

返回目錄

字串分為兩種儲存結構:順序儲存和鏈式儲存。

  • 順序儲存:用一組地址連續的儲存單元來儲存字串中的字元序列,我們一般用陣列來定義。
  • 鏈式儲存:字串的鏈式儲存,和線性表的鏈式儲存很相似。但是由於字串結構的特殊性,結構中的每個元素為字元。如果也按照線性表的鏈式儲存,每個節點存放一個字元,那麼就會造成很大的空間浪費。

那麼問題來了:聽不懂是不是。

不管你聽不聽得懂,反正 jsliang 是不太懂了。

所以我們不管它有的沒的先,看完一遍就行了。

是的,不用你以為,要我以為,這篇文章中聽我的就好了。/滑稽

在這裡引入這個,主要是表明,在很多場合,我們會將 字串轉換成陣列

'jsliang'.split(''); // ['j','s','l','i','a','n','g']
複製程式碼

從而使用陣列中的豐富 API:

註釋 1:不強行理解 順序儲存和鏈式儲存 的概念是因為 jsliang 覺得現在還沒有到需要理解的地步。

註釋 2:如果你純粹是個知識大師,卻敲不了一行程式碼,那是不行的,所以 jsliang 強烈推薦在瞭解概念的同時多練習練習。

四 字串的常用知識點

返回目錄

在上面我們講解了字串的基礎知識,並且提到了字串在使用中會轉換成數字或者陣列,從而更方便我們進行程式設計。

那麼,下面我們就通過字串相關的 LeetCode 題,來串聯一些字串的 API,從而幫助小夥伴們快速瞭解其使用方式,加強自己的基礎。

應用程式介面(API)是基於程式語言構建的結構,使開發人員更容易地建立複雜的功能。它們抽象了複雜的程式碼,並提供一些簡單的介面規則直接使用。

客戶端 JavaScript 中有很多可用的 API:
瀏覽器 API 內建於Web瀏覽器中,能從瀏覽器和電腦周邊環境中提取資料,並用來做有用的複雜的事情。
第三方 API 預設情況下不會內建於瀏覽器中,通常必須在Web中的某個地方獲取程式碼和資訊。

在此之前,我們先看看字串有哪些 API,然後開始針對一些常見的 API,在 LeetCode 中鍛鍊一下思路:

瀏覽器內建物件隻字串 API

new String; // 在瀏覽器敲入 new String

// 輸出
String {
  length: 0,
  __proto__: {
    anchor: ƒ anchor(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    big: ƒ big(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    blink: ƒ blink(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    bold: ƒ bold(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    charAt: ƒ charAt(),
    charCodeAt: ƒ charCodeAt(),
    codePointAt: ƒ codePointAt(), // 返回使用 UTF-16 編碼的給定位置的值的非負整數。
    concat: ƒ concat(),
    constructor: ƒ String(), // 用於創造物件的原型物件的特定的函式。
    endsWith: ƒ endsWith(), // 需要相容處理(ES6)
    fixed: ƒ fixed(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    fontcolor: ƒ fontcolor(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    fontsize: ƒ fontsize(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    includes: ƒ includes(),
    indexOf: ƒ indexOf(),
    italics: ƒ italics(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    lastIndexOf: ƒ lastIndexOf(),
    length: 0,
    link: ƒ link(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    localeCompare: ƒ localeCompare(), // 返回一個數字表示是否引用字串在排序中位於比較字串的前面,後面,或者二者相同。
    match: ƒ match(),
    matchAll: ƒ matchAll(),
    normalize: ƒ normalize(), // 返回撥用字串值的Unicode標準化形式。
    padEnd: ƒ padEnd(),
    padStart: ƒ padStart(),
    repeat: ƒ repeat(),
    replace: ƒ replace(),
    search: ƒ search(),
    slice: ƒ slice(),
    small: ƒ small(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    split: ƒ split(),
    startsWith: ƒ startsWith(), // 需要相容處理(ES6)
    strike: ƒ strike(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    sub: ƒ sub(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    substr: ƒ substr(), // 避免使用,後期可能被移除
    substring: ƒ substring(),
    sup: ƒ sup(), // 被限制使用,因為只對可用的 HTML 標籤和屬性提供部分支援。
    toLocaleLowerCase: ƒ toLocaleLowerCase(),
    toLocaleUpperCase: ƒ toLocaleUpperCase(),
    toLowerCase: ƒ toLowerCase(),
    toString: ƒ toString(),
    toUpperCase: ƒ toUpperCase(),
    trim: ƒ trim(),
    trimEnd: ƒ trimEnd(),
    trimLeft: ƒ trimStart(),
    trimRight: ƒ trimEnd(),
    trimStart: ƒ trimStart(),
    valueOf: ƒ valueOf(), // 返回特定物件的原始值。
    Symbol(Symbol.iterator): ƒ [Symbol.iterator](),
  }
}
複製程式碼

常用字串 API

API 功能
str.charAt(index) 返回特定位置的字元。
str.charCodeAt(index) 返回表示給定索引的字元的 Unicode 的值。
str.concat() 連線兩個字串文字,並返回一個新的字串。
str.includes() 判斷一個字串裡是否包含其他字串。
str.indexOf() 從字串物件中返回首個被發現的給定值的索引值,如果沒有找到則返回 -1。
str.lastIndexOf() 從字串物件中返回最後一個被發現的給定值的索引值,如果沒有找到則返回 -1。
str.length 返回了字串的長度。
str.match() 使用正規表示式與字串相比較。
str.matchAll() 返回一個包含所有匹配正規表示式及分組捕獲結果的迭代器。
str.padEnd() 在當前字串尾部填充指定的字串,直到達到指定的長度。返回一個新的字串。
str.padStart() 在當前字串頭部填充指定的字串,直到達到指定的長度。返回一個新的字串。
str.repeat() 返回指定重複次數的由元素組成的字串物件。
str.replace() 被用來在正規表示式和字串直接比較,然後用新的子串來替換被匹配的子串。
str.search() 對正規表示式和指定字串進行匹配搜尋,返回第一個出現的匹配項的下標。
str.slice() 摘取一個字串區域,返回一個新的字串。
str.split() 通過分離字串成子串,將字串物件分割成字串陣列。
str.substring() 返回在字串中指定兩個下標之間的字元。
str.toLocaleLowerCase() 根據當前區域設定,將符串中的字元轉換成小寫。對於大多數語言來說,toLowerCase 的返回值是一致的。
str.toLocaleUpperCase() 根據當前區域設定,將字串中的字元轉換成大寫,對於大多數語言來說,toUpperCase的返回值是一致的。
str.toLowerCase() 將字串轉換成小寫並返回。
str.toUpperCase() 將字串轉換成大寫並返回。
type.toString() 返回用字串表示的特定物件。
str.trim() 從字串的開始和結尾去除空格。
str.trimEnd() / str.trimRight() 從字串的右側去除空格。
str.trimStart() / str.trimLeft() 從字串的左側去除空格。

如上,我們列出了 23 種 可能 比較常用的 字串 API

但是,如果僅僅這樣列出來,那還不如直接看 MDN 關於 JavaScript 字串的講解:

所以,下面將進行歸類,並通過 LeetCode 進行詳細剖析學習。

參考文獻

4.1 字串 - 查詢

返回目錄

  1. str.length:返回了字串的長度。詳細學習
  2. str.charAt(index):返回特定位置的字元。詳細學習
  3. str.charCodeAt(index):返回表示給定索引的字元的 Unicode 的值。詳細學習
  4. str.includes(searchString, fromIndex)):判斷一個字串裡是否包含其他字串。詳細學習
  5. str.indexOf(searchString, fromIndex):從字串物件中返回首個被發現的給定值的索引值,如果沒有找到則返回 -1。詳細學習
  6. str.lastIndexOf(searchString, fromIndex):從字串物件中返回最後一個被發現的給定值的索引值,如果沒有找到則返回 -1。詳細學習
  7. str.substring(indexStart, indexEnd):返回在字串中指定兩個下標之間的字元。詳細學習

4.2 字串 - 正規表示式

返回目錄

  1. str.match(regexp):使用正規表示式與字串相比較。詳細學習
  2. str.matchAll(regexp):返回一個包含所有匹配正規表示式及分組捕獲結果的迭代器。詳細學習
  3. str.replace(regexp |substr, newSubStr| function):被用來在正規表示式和字串直接比較,然後用新的子串來替換被匹配的子串。詳細學習
  4. str.search(regexp):對正規表示式和指定字串進行匹配搜尋,返回第一個出現的匹配項的下標。詳細學習

4.3 字串 - 修改

返回目錄

  1. str.concat(string2, string3, ..., stringN):連線兩個字串文字,並返回一個新的字串。詳細學習
  2. str.padStart(targetLength, padString):在當前字串頭部填充指定的字串,直到達到指定的長度。返回一個新的字串。詳細學習
  3. str.padEnd(targetLength, padString):在當前字串尾部填充指定的字串,直到達到指定的長度。返回一個新的字串。詳細學習
  4. str.repeat(count):返回指定重複次數的由元素組成的字串物件。詳細學習
  5. str.slice(beginIndex, endIndex):摘取一個字串區域,返回一個新的字串。詳細學習

4.4 字串 - 轉型別

返回目錄

  1. str.split(separator, limit):(字串轉陣列)通過分離字串成子串,將字串物件分割成字串陣列。詳細學習
  2. type.toString():(其他型別轉字串)返回用字串表示的特定物件。詳細學習

4.5 字串 - 大小寫

返回目錄

  1. str.toLocaleLowerCase() / str.toLowerCase():根據當前區域設定,將符串中的字元轉換成小寫。對於大多數語言來說,toLowerCase 的返回值是一致的。詳細學習
  2. str.toLocaleUpperCase() / str.toUpperCase():根據當前區域設定,將字串中的字元轉換成大寫,對於大多數語言來說,toUpperCase 的返回值是一致的。詳細學習

4.6 字串 - 去空格

返回目錄

  1. str.trim():從字串的開始和結尾去除空格。詳細學習
  2. str.trimStart() / str.trimLeft():從字串的左側去除空格。詳細學習
  3. str.trimEnd() / str.trimRight():從字串的右側去除空格。詳細學習

五 LeetCode - 字串訓練

返回目錄

首先,由於 jsliang 在編寫時發現,如果針對某個 API 然後找到對應的某個題給小夥伴嘗試,無異議飲鴆止渴,對後期成長是沒有幫助的。

然後jsliang 嘗試攻略的這些題目的覆蓋範圍可能不是小夥伴想要的(即做了對字串沒法非常深入瞭解,覆蓋面也可能不全),所以小夥伴可以嘗試自己選題:

最後,貼上一些目前 jsliang 已經攻略的字串題目,希望對小夥伴們有所幫助:

六 總結

返回目錄

經過前面一系列的折騰,我們基本對字串的各種操作有所瞭解,雖然談不上 精通,但是支援日常工作是毫無問題的。

畢竟在日常工作中,字串很常見,所以我們還是需要去發掘它,使用它的。

那麼,字串的講解就到此為止啦,我們們下個知識點再見~

如果你覺得 jsliang 寫得很 OK,歡迎點贊、留言、加微信好友、關注微信公眾號等。

我們們,將繼續探索,紮實程式設計基礎,瞭解更多的資料結構和演算法!

jsliang 的聯絡方式盡在 jsliang 的文件庫github.com/LiangJunron…


不折騰的前端,和鹹魚有什麼區別!

資料結構 - 字串

jsliang 會每天更新一道 LeetCode 題解,從而幫助小夥伴們夯實原生 JS 基礎,瞭解與學習演算法與資料結構。

掃描上方二維碼,關注 jsliang 的公眾號,讓我們一起折騰!

知識共享許可協議
jsliang 的文件庫樑峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議進行許可。
基於github.com/LiangJunron…上的作品創作。
本許可協議授權之外的使用許可權可以從 creativecommons.org/licenses/by… 處獲得。

相關文章