1. 程式人生 > 實用技巧 >每週一題:第一個出現的字元+交換數字(更新JS)

每週一題:第一個出現的字元+交換數字(更新JS)

題目一:

在字串 s 中找出第一個只出現一次的字元。如果沒有,返回一個單空格。 s 只包含小寫字母。

示例:

s = "abaccdeff"
返回 "b"

s = ""
返回 " "

程式碼:

varfirstUniqChar=function(s){ if(s==''){ return""; } for(leti=0;i<s.length;i++){ if(s.lastIndexOf(s[i])==s.indexOf(s[i])){ returns[i]; } } return""; }; 通過率: 思路: 這道題需要我們在字串裡面找出第一個只出現一次的字母,首先我們需要考慮字串為空的情況,將這種情況單獨列出來後,再來尋找。 一開始我是想通過遍歷迴圈來計算每個字母出現的次數,然後比較每個字母次數大小找到只出現一次字母,接著比較陣列下標,最小的那個字母即為第一個只出現一次的。但在後期實現程式碼時發現極易混淆,時間效率也頗為低下,便放棄了這種方法,轉而開始尋找有哪種方法能夠比較快捷的得出結果的,後來發現了js裡面的indexOf 和 lastIndexOf 函式用法,便用這個寫出了程式碼。
  • indexOf是查某個指定的字串在字串首次出現的位置(索引值)(從左往右)
  • lastIndexOf 是查某個指定的字串在字串最後一次出現的位置(索引值)(從右往左)
假如我們要找題目中第一個出現一次的字母,只需要判斷這兩種方法得出來的陣列下標是否為同一個即可。

而且值得注意的是:lastIndexOf() 方法可返回一個指定的元素在陣列中最後出現的位置,是從該字串的後面向前查詢,其雖然是從後往前搜尋,但返回的位置是從前開始數的。

題目二:

編寫一個函式,不用臨時變數,直接交換numbers = [a, b]ab的值。

示例:

輸入:numbers=[1,2]

輸出:[2,1]

程式碼:

varswapNumbers=function(numbers){ numbers[0]=numbers[0]+numbers[1]; numbers[1]=numbers[0]-numbers[1]; numbers[0]=numbers[0]-numbers[1]; returnnumbers; }; 通過率:
思路: 這道題初看時我很為難,不知道該怎樣才能在不設定中間臨時變數的情況下將陣列內的兩個資料進行位置交換,後來是將此題當作數學題寫時突然反應過來的。既然題目不準設定新的臨時變數作為中轉站,那就讓已存在的變數來做跳板。首先將陣列中任意一個數據的值變為兩資料之和,然後不斷進行相互轉換。相關步驟可以看我的程式碼基本就能明白。但並不能將這道題當作一個完全的數學題來看待,因為計算機語言和數學解題是完全不同的,但我們可以將其作為一條思路來看待。