數據結構 - 字符串

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

數組 - 最簡單的內存數據結構。前端

字符串 - 隨時能夠轉換成數字或者數組的簡單類型。git

重點推薦:String - MDNgithub

jsliang 的聯繫方式盡在 jsliang 的文檔庫https://github.com/LiangJunro...

一 目錄

不折騰的前端,和鹹魚有什麼區別正則表達式

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

二 前言

返回目錄

什麼是字符串?編程

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

若是字符串的個數爲零,則代表這個字符串爲 空串(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 的文檔庫https://github.com/LiangJunro...

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

圖片描述

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

掃描上方二維碼,關注 jsliang 的公衆號,讓咱們一塊兒折騰!

<img alt="知識共享許可協議" style="border-width:0" src=" https://i.creativecommons.org...; />
<span xmlns:dct=" http://purl.org/dc/terms/&quot; property="dct:title">jsliang 的文檔庫</span> 由 梁峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議進行許可。
基於 https://github.com/LiangJunro...上的做品創做。
本許可協議受權以外的使用權限能夠從 https://creativecommons.org/l... 處得到。
相關文章
相關標籤/搜索