JavaScript中的大小寫敏感排序
題目要求對使用者提供的字串陣列進行JavaScript大小寫敏感排序。
題目要求開發人員執行大小寫敏感排序,所有特殊字元和數字應首先出現並優先排序,然後是小寫字母,最後是大寫字母。
JavaScript是大小寫敏感的嗎?
在繼續解決問題之前,我們需要先了解JavaScript中“大小寫敏感”一詞的含義。JavaScript是一種大小寫敏感的程式語言,它能夠區分大小寫。
例如,在控制檯中給出一些不同型別的變數,JavaScript會識別每個變數的唯一字元。
示例
const language = "JavaScript"; const Language = "React"; const x = 100; console.log(language); console.log(Language); console.log(x);
輸出
JavaScript React 100
排序方法是大小寫敏感的嗎?
JavaScript中的sort方法會就地排序陣列,預設情況下按升序排列結果陣列。但是,JavaScript在這裡有一個陷阱,它首先將要排序的每個元素轉換為字串資料型別,然後執行排序。
在JavaScript中,sort方法的底層機制與許多其他程式語言的排序機制不同。在每個元素最初轉換為字串後,這些轉換完全基於UTF-16,隨後是元素在轉換過程中的順序,這決定了JavaScript中sort方法的排序引數。UTF-16允許在您的域中使用更多字元和表情符號,因此希望進行高效的大規模排序。
排序方法的預設行為是先排序大寫字母,然後是小寫字母。例如:
示例
const sortString = ["Banana", "apple", "Kiwi", "grapes", "Ice-cream"]; console.log(sortString.sort());
輸出
['Banana', 'Ice-cream', 'Kiwi', 'apple', 'grapes']
預設行為還在於先排序數字,然後是大寫字母,最後是小寫字母。例如:
示例
const sortString = [ "Banana" , "1" , "apple" ]; console.log(sortString.sort());
輸出
[ '1', 'Banana', 'apple' ]
localeCompare方法是什麼?
localeCompare方法是JavaScript中內建的字串比較方法,用於根據字母表的每次出現來比較和排序字串,並返回一個數字,該數字可以小於0、大於0或等於0,表示在您編寫的自定義排序函式中,哪個字串位於哪個字串之前、之後或等於哪個字串。localeCompare方法有兩個部分:比較字串和參考字串,其中比較字串作為引數給出,參考字串用於呼叫localeCompare方法,比較字串作為引數。
語法如下:
referenceString.localeCompare(comparisonString)
根據提到的語法,建立了幾種情況,根據以下情況返回一個數字:
如果參考字串出現在比較字串之前,則該方法返回負數-1
如果參考字串出現在比較字串之後,則該方法返回正數1
如果參考字串和比較字串相等,則該方法返回中性數0
示例
沒有localeCompare的示例如下:
const sortString = [ "Banana" , "1" , "apple" ]; console.log(sortString.sort());
輸出
[ '1', 'Banana', 'apple' ]
示例
使用localeCompare的示例如下:
function compareSort(a,b) { return a.localeCompare(b); } const sortString = [ "Banana" , "1" , "apple" ]; console.log(sortString.sort(compareSort));
輸出
[ '1', 'apple', 'Banana' ]
演算法
針對特定問題陳述的演算法涉及遞迴技術,以便對大小寫敏感排序中發生的每次比較重複某個輔助函式。
步驟1:宣告一個名為caseSensitiveSort的函式,該函式接收一個字串陣列作為輸入。
步驟2:使用JavaScript的sort方法,從該函式返回一個自定義排序輔助函式作為引數。
步驟3:宣告一個名為sensitiveSorter的自定義排序函式,該函式接收兩個引數a和b,以比較字串陣列中存在的每兩個連續元素。
步驟4:輔助函式或自定義排序函式本質上是一個遞迴函式,因此為遞迴技術產生一些基本情況,即如果第一個元素和第二個元素相同,則得出該字串陣列中只有一個元素。
步驟5:使用charAt方法匹配兩個連續元素的第一個字元,如果匹配成功,則使用JavaScript的splice方法剪下兩個元素的第一個字元,以便使用兩個元素的下一個字元再次執行輔助函式sensitiveSorter的遞迴性質,您正在嘗試對其進行排序。
步驟6:如果兩個元素的第一個字元不匹配,則將其轉換為小寫,如果成功匹配,則使用正則表示式針對JavaScript中的test方法檢查第一個元素的第一個字元是否為小寫,第二個元素的第一個字元是否為大寫,這表明第一個元素將出現在第二個元素之前,因此返回與localeCompare方法相容的負數-1,我們將在演算法的後續步驟中看到。
步驟7:如果兩個元素的第一個字元不匹配,則將其轉換為小寫,如果成功匹配,則使用正則表示式針對JavaScript中的test方法檢查第一個元素的第一個字元是否為大寫,第二個元素的第一個字元是否為小寫,這表明第一個元素將出現在第二個元素之後,因此返回與localeCompare方法相容的正數+1,我們將在演算法的後續步驟中看到。
步驟8:之後,使用JavaScript中的localeCompare方法根據每個字母的出現情況按字母順序排序兩個連續的元素,返回小於0、大於0或等於0的數字,其情況已在上述步驟中處理。
示例
function sensitiveSorter(a,b) { if(a===b) { return 0 ; } if(a.charAt(0)===b.charAt(0)) { return sensitiveSorter(a.slice(1) , b.slice(1)); } if (a.charAt(0).toLowerCase() === b.charAt(0).toLowerCase() ) { if(/^[a-z]/.test(a.charAt(0)) && /^[A-Z]/.test(b.charAt(0))) { return -1 ; } if(/^[a-z]/.test(b.charAt(0)) && /^[A-Z]/.test(a.charAt(0))) { return -1 ; } } return a.localeCompare(b); } function caseSensitiveSort(stringArray) { return stringArray.sort(sensitiveSorter); } const stringArray = ["123" , "Hello" , "1TuorialsPoint" , "apple" , "$1jain" , "JAVASCRIPT" ]; const sensitiveSortedResult = caseSensitiveSort(stringArray); console.log(sensitiveSortedResult);
輸出
[ '$1jain', '123', '1Tutorialspoint', 'apple', 'Hello', 'JAVASCRIPT' ]
以下提到的程式碼是檢視問題陳述時可以想到的直接程式碼,稍後您可以當然將其最佳化到更好的空間和時間質量,使其更有效率和高質量。
在上面的程式碼中,我們聲明瞭一個接收字串陣列輸入的函式。然後,我們通過了解排序機制並使用if-else階梯以及JavaScript方法(如splice、charAt和最重要的localeCompare JavaScript內建方法)來間接地一次性完成大小寫敏感排序。
時間和空間複雜度
Array.sort()方法基於時間排序演算法,時間複雜度為O(n log n),最壞情況下時間複雜度為O(n^2),而charAt方法的時間複雜度為O(1)(常數),splice方法的最壞情況時間複雜度為O(n)。整個遞迴函式的時間複雜度為O(2^n),產生遞迴函式的子分支,降低了時間複雜度。因此,結果不夠最佳化,但sort方法只能針對此類問題陳述執行大小寫敏感性。
結論
這就是我們如何透過邏輯思考和編碼上下文來解決上述問題陳述,並充分利用JavaScript方法sort及其其他內建方法。