字符串去重的再研究


1、前言
      今天參加了 某公司的在線筆試,其實題目很簡單,一道是關於數組去重,另外一道就是字符串替換的問題。這些問題都是網上很常見的問題,但是答的並不是很理想,如果打分的話只能得到70分,面試官也說我的編程水平中等,這樣的評價我是完全認同的。現在就回過頭來用多種辦法求解這兩道題吧。
2、數組去重
方法1:使用hash的方法解決該問題
2.1.1 初次寫出的代碼
Array.prototype.unique = function(){
  var arr = this, obj = {}, result ,i, len = arr.length;
  for(i=0 ; i<len; i++){
       if(!obj[arr[i]]){
           obj[arr[i]] = true;
      result.push(arr[i]);
       }
    }
    return result;
}

 這是我第一次寫的代碼,咋一看沒什么問題,但是請看下面這個例子

var a = ['a','b','a','c',3,5,8,3,'8']
a.unique()  //  ['a','b','c',3,5,8]

但是我們期望的結果是什么呢?自然是['a','b','c',3,5,8,'8'],至於什么原因大家都明白。下面是當時我寫的很2的方法: 

2.1.2 第一次修bug
Array.prototype.unique=  function(){
     var arr = this, obj1 = {}, obj2 = {}, result = [], i , len = arr.length;
     for(i=0; i< len; i++){
         if(typeof arr[i] === 'number'){ 
              if(!obj1[arr[i]]){ 
           obj1[arr[1]] = true;
                 result.push(arr[i]);
              }
          }else{
              if(!obj2[arr[i]]){
                  obj2[arr[i]] = true;
                  result.push(arr[i]); 
              } 
          }
       }
       return  result;
} 
var a = ['a','b','a','c',3,5,8,3,'8']
var b = a.unique(); //['a','b','c',3,5,8,'8']

 


IQ太低,上面的代碼太土,太2,現在想想看還有沒有其他辦法。

2.1.3 第二次修bug
Array.prototype.unique=  function(){
	var arr = this, obj = {}, result = [], i , len = arr.length;
	for(i=0; i< len; i++){
	 if(obj[arr[i]] !== arr[i] ){
	      obj[arr[i]] = arr[i];
	      result.push(arr[i]); 
	 }
	}
	return result;
}
var a = ['a','b','a','c',3,5,8,3,'8'];
var b = a.unique();  // ['a','b','c',3,5,8,'8']

 


接下來問題來了,假如存在這樣的數組 var a = ['a','b','a','c',3,5,8,3,'8',8];你媽這又出現問題了,結果為['a','b','c',3,5,8,'8',8],那就都存起來:

2.1.4 第三次修bug
if(!Array.prototype.indexOf){
	Array.prototype.indexOf = function(ele,index){
		var arr = this, len = arr.length, index = index >= 0 ? index : index + len ,i;
		for(i=index; i < len; i++){
		    if(arr[i] === ele){
		      return i;
		    }
		}
		return -1;
	}
}

Array.prototype.unique=  function(){
	var arr = this, obj = {}, result = [], i , len = arr.length;
	for(i=0; i< len; i++){
		obj[arr[i]] = obj[arr[i]] || [];
	 	if(obj[arr[i]].indexOf(arr[i]) === -1 ){
	           obj[arr[i]].push(arr[i]);
	           result.push(arr[i]); 
	 	}
	}
	return result;
}
var a =  ['a','b','a','c',3,5,8,3,'8',8];
var b = a.unique(); // ['a','b','c',3,5,8,'8'] 到目前為止應該不會出現bug了
方法2:使用indexOf方法或者lastIndexOf方法
     這個方法需要考慮到低版本的瀏覽器是不知道indexOf屬性的,所以使用前非常有必要寫下兼容性的代碼:
if(!Array.prototype.indexOf){
	Array.prototype.indexOf = function(ele,index){
		var arr = this, len = arr.length, index = index >= 0 ? index : index + len ,i;
		for(i=index; i < len; i++){
		    if(arr[i] === ele){
		      return i;
		    }
		}
		return -1;
	}
}
Array.prototype.unique=  function(){
	var arr = this, obj = {}, result = [], i , len = arr.length , n;
	for(i=0; i< len; i++){
		n = arr.indexOf(arr[i],i+1);
		if( n !== -1){
			arr.splice(n,1);
		}
	}
	return arr;
}
var a =  ['a','b','a','c',3,5,8,3,'8',8];
var b = a.unique();  //['a','b','c',3,5,8,'8']
現在想出來的也就這兩種方法了。 


免責聲明!

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



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