大家好,開發者們!
今天,我嘗試從零開始實作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()
方法接受三個參數:
string
:要搜尋的字串。 target
:要找的子字串。 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.length
到string.length
的範圍內。 string.length
確保任何負面結果都變成正數。 start
的值被環繞並落在有效的索引邊界內。 接下來我想使用二分查找而不是線性查找,您覺得怎麼樣?
以上是string.indexOf() 底層的詳細內容。更多資訊請關注PHP中文網其他相關文章!