給定一個字符串,找到它的第一個不重復的字符,並返回它的索引。如果不存在,則返回 -1。


題目:

給定一個字符串,找到它的第一個不重復的字符,並返回它的索引。如果不存在,則返回 -1。

 
         

案例:

 
         

s = "leetcode"
返回 0.

 
         

s = "loveleetcode",
返回 2.






解法一 : 有點暴力,主要思路為拋出本身后,利用indexOf查詢查找是否存在重復值,不存在則直接返回當前索引
/*
* * @param {string} s * @return {number} */ var firstUniqChar = function(s) { var len = s.length; for(var i=0;i<len;i++){ var str = s, test = str.split(''); test.splice(i,1); var sub = test.indexOf(s[i]); if(sub === -1) return i; } return -1; };
解法二:
這里的思路是利用中間變量做計數器 ,記錄重復個數。一旦遇到重復直接跳出這次循環,去查找下一個數是否匹配。以此類推,一旦遇到第一個不重復的則直接返回 當前索引 中斷所有循環

/*
* * @param {string} s * @return {number} */ var firstUniqChar = function(s) { var len = s.length;
  //循環每個需要對比的值
for(var i=0;i<len;i++){
    //引入計數器
var sub = 0;
    //循環每個除本身以外的參照值
for(var j=0;j<len;j++){
        //遇到重復且非本身 計數器累加 且直接跳出循環進行下一次對比
if(s[i] === s[j] && i!==j) {
          sub++;
          break;
        } }
if(sub === 0) return i; } return -1; };

 

方法三
  方法二始終覺得重復循環次數過多 而且時間復雜度也達到了O(n^2),
  則想到了利用哈希來存儲重復的次數,在循環字符串查找哈希中值為1的這個字符,第一次遇到則返回,這樣循環次數相對減少時間復雜度也降到了O(n)
/*
* * @param {string} s * @return {number} */ var firstUniqChar = function(s) { var len = s.length, haxi = {}; for(var i=0;i<len;i++){ var sub = haxi[s[i]]; if(sub){ haxi[s[i]] = ++sub; }else{ haxi[s[i]] = 1; } } for(var i=0;i<len;i++){ if(haxi[s[i]] === 1) { return i } } return -1; };

 

除了上述解法之外,基於解法二思路想到的解法思路,

  即第一次將字符串中與第一個字符重復的字符提取出,返回提取后的新字符串,進行下一輪提取,知道遇到第一個提取不到重復值的字符,利用indexOf查詢這個字符串返回其索引,或則無不重復直接返回-1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM