首頁 > web前端 > js教程 > string.indexOf() 底層

string.indexOf() 底層

DDD
發布: 2025-01-17 08:27:08
原創
117 人瀏覽過

string.indexOf() under the hood

大家好,開發者們!

今天,我嘗試從零開始實作indexOf()方法。到目前為止,我發現以下內容:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    // 调整起始索引,如果它是负数
    if (start < 0) {
        start = string.length + start;
    }

    // 确保起始索引在字符串长度范围内
    if (start < 0) {
        start = 0;
    } else if (start >= string.length) {
        return -1; // 目标索引超出字符串范围
    }

    // 循环遍历字符串
    for (let i = start; i <= string.length - l; i++) {
        if (string.substring(i, i + l) === target) {
            return i; // 找到目标子串
        }
    }

    return -1; // 未找到目标子串
}</code>
登入後複製

代碼解釋:

indexOf()方法接受三個參數:

  1. string:要搜尋的字串。
  2. target:要找的子字串。
  3. start:搜尋將開始的索引(預設為0)。

我的第一次嘗試:

我最初的想法很簡單:循環遍歷字串,當我找到string[i] === target時,回傳i。如果循環結束時沒有找到匹配項,則傳回-1。程式碼如下:

<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
登入後複製

然而,這種方法只在target是單一字元時有效,因為我們是逐個字元進行比較。

我的第二次嘗試:

然後我意識到,如果target的長度超過一個字符,我需要比較子字串。我使用substr()方法來比較與target長度相同的子字串。循環調整為當字串中剩餘的字元足夠進行比較時停止:

<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
登入後複製

我的第三次嘗試:

接下來,我需要處理start參數,它可以是負數。內建的indexOf()方法在start為負數時從string.length start開始搜尋。例如,如果字串長度為10,start為-4,則搜尋將從索引6(即10 - 4)開始。

為了解決這個問題,我更新了程式碼以處理負的start值:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    if (start < 0) {
        start = string.length + start;
    }

    // ... (其余代码与第二次尝试相同)
}</code>
登入後複製

最終版本:

出於好奇,我想處理大於字串長度的start值,我決定修改函數,以便如果start超過字串長度,則繼續「環繞」字串。這樣,函數將在環繞後從適當的索引繼續搜尋。最終的解決方案使用此公式來調整起始索引:

<code class="language-javascript">start = (string.length + start) % string.length;</code>
登入後複製

工作原理:

  • 模運算子start % string.length確保start在-string.lengthstring.length的範圍內。
  • string.length確保任何負面結果都變成正數。
  • 最終的模運算確保start的值被環繞並落在有效的索引邊界內。

接下來我想使用二分查找而不是線性查找,您覺得怎麼樣?

以上是string.indexOf() 底層的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板