去重

http://topic.csdn.net/u/20090520/10/8709aca9-40f5-40ef-9b41-6886ee9223e2.html

要求:必须要正则表达式来实现
再强调, 不要循环,尽量用正则表达式。 楼主要求不清晰??

正则玩不转,等高人
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#3楼 得分:0回复于:2009-05-20 10:42:57
我的意思是不用循环语句(for,while等)来实现,直接用正则表达式实现
 
#4楼 得分:0回复于:2009-05-20 10:59:34
引用 2 楼 gengzhw 的回复:
要求:必须要正则表达式来实现 
再强调,不要循环,尽量用正则表达式。 楼主要求不清晰?? 

正则玩不转,等高人

帮顶
 
#5楼 得分:0回复于:2009-05-20 10:59:51
我这个还是用了循环

JScript code
            
            
function dN(num, len){ return num.toString().replace( / -?0?\.0* / , "" ).replace( / \d / g, function (a){ return arguments[ 2 ].substr( 0 , arguments[ 1 ]).indexOf(arguments[ 0 ]) >= 0 ? '' : arguments[ 0 ]; }).substr( 0 , len); } alert(dN( - 0.03454114560776 , 5 ));
 
#6楼 得分:0回复于:2009-05-20 11:10:43
这个效率要好点...

HTML code
            
            
function dN(num, len){ var d = 0; return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){ return i-d > len ? '' : (s.substr(0, i).indexOf(v) >= 0 ? (d++,'') : v); }).substr(0, len); } alert(dN(-0.303333351211745764444444444444444,5));

 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#7楼 得分:0回复于:2009-05-20 11:13:29
谢谢大哥,高手!
你后面这个正是我想到的优化
 
#8楼 得分:10回复于:2009-05-20 11:13:56
JScript code
            
            
< script type = " text/javascript " > <!-- var nstr = "" ; function dN(num,len){ num.toString().replace( / -|0(?=\.)|\. / g, function (){ return arguments[ 3 ];}).replace( / \d / g, function (){ (nstr.indexOf(arguments[ 0 ]) == - 1 ) && (nstr += arguments[ 0 ]) }) return nstr.substring( 0 ,len) } alert(dN( - 0.233641464278 , 5 )) // --> < / script>
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#9楼 得分:0回复于:2009-05-20 11:15:19
我刚测试了下;
但是比我的期望效率还是低了点。

一旦循环效率就很低。
因为我的运算量非常大,中间最耗时的就是这个函数。
 
#10楼 得分:0回复于:2009-05-20 11:17:47
好像去重就得要循环匹配,楼主是做啥运算?
 
#11楼 得分:0回复于:2009-05-20 11:21:19
学习了
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#12楼 得分:0回复于:2009-05-20 11:22:31
主要是带循环,效率感觉还是不行,我测试了;
比我原先些的函数执行效率是提高了20%左右。
我希望再优化一下就好了;
再次感谢
 
#13楼 得分:40回复于:2009-05-20 11:27:24
再优化了一下, 不知道用哈希效率怎么样, 期待高手出现.

JScript code
            
            
function dN(num, len){ var d = 0 ; return num.toString().replace( / -?0?\.0* / , "" ).replace( / \d / g, function (v, i, s){ return i - d >= len ? '' : (s.indexOf(v) < i ? (d ++ , '' ) : v); }); } alert(dN( - 0.303333351211745764444444444444444 , 5 ));
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#14楼 得分:0回复于:2009-05-20 11:37:56
谢谢,最好这个执行效率有稍微提高;
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#15楼 得分:0回复于:2009-05-20 11:40:11
数字串越长,后面这个效率提供更明显些;

主要还是希望能质的飞跃;如果能提供一倍,我的整个运算将解决5秒钟!!!
期待高手加入!
 
#16楼 得分:0回复于:2009-05-20 12:19:44
神奇的代码,学习了
 
  • lfywy用户头像
  • lfywy
  • (云中深海)
  • 等 级:
#17楼 得分:0回复于:2009-05-20 12:48:43
学习
 
#18楼 得分:10回复于:2009-05-20 13:29:39
试试看:

JScript code
            
            
< script type = " text/javascript " > var dN = function (num,len){ var s = num.toString().replace( / (?:^[^\d]*0*|[^\d])* / g, '' ).split( '' ).reverse().join( '' ).replace( / (\d)(?=.*\1) / g, '' ).split( '' ).reverse(); s.length = len; return s.slice( 0 ).join( '' ); }; alert(dN( - 0.233641464278 , 4 )); alert(dN( - 0.303545 , 3 )); alert(dN( 33766545 , 4 )); < / script>
 
#19楼 得分:40回复于:2009-05-20 13:44:31
正则效率并不会比直接循环更快,只是开发效率快而已。正则自身也是需要循环来判断的。

试试这个:
JScript code
            
            
function dN(num, len){ num = num.toString().replace( / ^0+|\D+ / g, "" ); var dict = {}; var result = 0 ; for ( var i = 0 ; len > 0 && i < num.length; i ++ ) { var c = num.charAt(i); if ( ! dict[c]) { result *= 10 ; result += parseInt(c); len -- ; dict[c] = true ; } } return result.toString(); } alert(dN( " 0.123153422 " , 6 ));

 
#20楼 得分:0回复于:2009-05-20 13:51:50
num = num.toString().replace(/^0+ (\.0+)?|\D+/g, "");

考虑到这类情况:
alert(dN("0.0123153678422", 2));[/code]
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#21楼 得分:0回复于:2009-05-20 14:04:54
正则效率更高,这个我测试过很多次了。
 
#22楼 得分:0回复于:2009-05-20 14:21:28
正则效率并不会比直接循环更快,只是开发效率快而已。正则自身也是需要循环来判断的。 
说得不全面,正则在解析引擎里还是做了优化的..相对循环来说, 还是要快...
 
#23楼 得分:0回复于:2009-05-20 14:24:55
全是牛人~~寒
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#24楼 得分:0回复于:2009-05-20 14:34:08
我来对执行效率排个名
在我模拟我程序应用中(ie6.0)的环境,

表现最好的是 Free_Wind22 ,执行时间为 1250ms;再次感谢你的2次改进。
function dN2(num, len){
  var d = 0;
  return (num+'').replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
  return i-d > len ? '' : (s.substr(0, i).indexOf(v) >= 0 ? (d++,'') : v);
  }).substr(0, len);
}

其次为dh20156,速度随变量的长度增大而变化明显。执行时间在 1550-2220之间;感谢;

var dN3 = function(num,len){
  var s = num.toString().replace(/(?:^[^\d]*0*|[^\d])*/g,'').split('').reverse().join('').replace(/(\d)(?=.*\1)/g,'').split('').reverse();
  s.length =len;
  return s.slice(0).join('');
};

再次为s_liangchao1s,执行时间在 2900左右;感谢;
  function dN1(num,len){  
var nstr = "";
  num.toString().replace(/-|0(?=\.)|\./g,function(){return arguments[3];}).replace(/\d/g, function(){
  (nstr.indexOf(arguments[0]) == -1) && (nstr += arguments[0])
  })
  return nstr.substring(0,len)
  }

再次为zswang ,执行时间为4500左右
function dN4(num, len){
  num = num.toString().replace(/^0+|\D+/g, "");
  var dict = {};
  var result = 0;
  for (var i = 0; len > 0 && i < num.length; i++) {
  var c = num.charAt(i);
  if (!dict[c]) {
  result *= 10;
  result += parseInt(c);
  len--;
  dict[c] = true;
  }
  }
  return result.toString();
}

一个小小的优化在一个大的运算量面前,效率差别非常明显;正则表达式在ie中执行速度优势明显!


完美结贴。感谢各位的帮助,一定向你们学习,不断进步。

再次特别感谢Free_Wind22 ;
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#25楼 得分:0回复于:2009-05-20 14:57:47
必须补充一下。
刚有点错误,再说明下,向zswang 道歉。

zswang 这位兄弟的时间我弄错了,我给前面一位加在一起了,非常抱歉。
你说的非常正确,你这个的执行效率也和Free_Wind22 优化后的函数效率相当。


测试中用的 Free_Wind22 是
function dN5(num, len){
  var d = 0;
  return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
  return i-d >= len ? '' : (s.indexOf(v) < i ? (d++,'') : v);
  });
}
,贴的时候贴错了。

谢谢所有朋友捧场,再见。
 
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#26楼 得分:0回复于:2009-05-20 15:08:46
自己还发现一个问题。
int.toString()的速度比int+'' 要慢。
int+'' 要快点。
 
#27楼 得分:0回复于:2012-03-01 01:12:16
JScript code
            
            
function dN(num, len){ var d = 0 ; return num.toString().replace( / -?0?\.0* / , "" ).replace( / (\d)(?:\1)* / g, function (v, i){ return d == len ? '' :( ++ d,i); }); }; function dN(num, len){ var d = 0 ; return num.toString().replace( / -?0?\.0* / , "" ).match( / (\d)(?!\1)+ / g).slice( 0 ,len).join( "" ); };
 
#28楼 得分:0回复于:2012-03-01 01:24:36
JScript code
            
            
function dN(num, len){ return num.toString().replace( / -?0?\.0* / , "" ).match( / (?:\d)(?!\1)+ / g).slice( 0 ,len).join( "" ); }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值