字符串去重和數組去重

聽說如今不少筆試和麪試都會考字符串去重和數組去重 面試

其實我很弱,數據結構很弱 算法

因此只是研究了一下,網上有不少中方法,我只是選了兩個本身勉強可以理解的寫寫 數組

第一個: 數據結構

//數組去重2
var delsRept = function(val){
   var ren=[];//返回的數組
   for(var i=0,len=val.length;i<len;i++){
	if(val.indexOf(val[i]) == i){//indexOf傳的值是匹配的字符,返回的是該字符在數組中第一次出現的位置
         	ren.push(val[i]);//若是當前出現的位置是第一次,就壓棧到ren裏
	}
   }
   return ren;
}
var value=["a",'a','d','d','c','a'];
console.log(delsRept(value));
第二個:
//字符串去重
var delRepte = function(str){
	var ret="",obj={};//ret爲返回的字符串,obj用於保存每一個字符的對象,用於防止進入對象的數據重複
	for(var i=0,len=str.length; i<len ;i++){
		var s = str.substr(i,1);//截取字符串的每個值,賦值給s
		obj[s] = s;//將"s":"s"類型的鍵值對放入obj對象裏
	}
	for(var key in obj){
		ret+= obj[key];	//便利對象obj,把鍵值對在組合成字符串放入ret
	}
	return ret;
};
var val="adasdfsdfsdfsdasd";
console.log(delRepte(val));
或許性能不是最高的,可是這是本身理解了的,順便也把網上找的其餘幾種方法貼上去


字符串去重

//第一個
var str = '';
if(!String.prototype.removal){
	String.prototype.removal = function(){
		if(!this) return;
		
		var obj = {};
		for(var i=0; i<this.length; ++i){
			obj[this.substr(i, 1)] = 1;
		}
		
		var str = '';
		for(var name in obj){
			str += name;
		}
		
		return str;
	}
}

console.log(str.removal());
//第二個用正則只是語句簡潔,不過要快的話仍是得用O(n)的算法:
function nubA(s) {
  return s.replace(/([\x00-\x7f])(?=.*?\1)/gi, '');
}

function nubB(s) {
  var codes = new Array(128);
  for (var i = 0, l = s.length; i < l; ++i) {
    var c = s.charCodeAt(i);
      codes[c] = c;
  }
  codes = codes.filter(function (v) {
    return v !== undefined;
  });
  return String.fromCharCode.apply(null, codes);
}
//第三種
var repeatClear = function(s){
          if(s){
              var m = {},n = "";
              for(var i in s){
                  if(s[i] in m){
                      //Do Nothing
                  }else{
                      m[s[i]] = true;
                      n += s[i];
                  }
              }
              return n;
          }else{
              return s;
          }
      };

    alert( repeatClear("aagbdfcedskahkxxbhxbshb") );
// 建議只循環一次,還有string的循環能夠直接用for-in的; string長度不足1的時候建議返回自己,而不是undefined。

數組去重

//方法1:
Array.prototype.distinct = function(){
	var arr = [],
	     len = this.length;

	for ( var i = 0; i < len; i++ ){
		for( var j = i+1; j < len; j++ ){
			if( this[i] === this[j] ){
				j = ++i;
			}
		}
		arr.push( this[i] );
	}
	return arr;
};
//方法二
Array.prototype.distinct = function(){
	
	var self = this,
		arr = self.concat().sort(); // 建立一個新數組並排序
	
	arr.sort(function( a, b ){
		if( a === b ){
			var n = self.indexOf( a ); //獲取索引值
			self.splice( n, 1 );
		}
	});
		
	return self;
	
};
//方法三
Array.prototype.delRepeat=function(){
	var newArray=[];
	var provisionalTable = {};
	for (var i = 0, item; (item= this[i]) != null; i++) {
        if (!provisionalTable[item]) {
            newArray.push(item);
            provisionalTable[item] = true;
        }
    }
    return newArray;
};
//方法四
Array.prototype.distinct = function(){
	var arr = [],
		obj = {},
		i = 0,
		len = this.length,
		result;

	for( ; i < len; i++ ){
		result = this[i];
		if( obj[result] !== result ){
			arr.push( result );
			obj[result] = result;
		}
	}

	return arr;
};
相關文章
相關標籤/搜索