去重

来源:互联网 发布:大数据服务器搭建 编辑:程序博客网 时间:2024/03/29 10:07
http://topic.csdn.net/u/20090520/10/8709aca9-40f5-40ef-9b41-6886ee9223e2.html

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

正则玩不转,等高人
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:[分享]JS围棋,顺便帮我看看怎么取得行棋路线数组
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#3楼 得分:0回复于:2009-05-20 10:42:57
我的意思是不用循环语句(for,while等)来实现,直接用正则表达式实现
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:dhATV(Ajax TreeView) V4.0
  • qingyun0719用户头像
  • qingyun0719
  • (叫我Dora吧)
  • 等 级:
#4楼 得分:0回复于:2009-05-20 10:59:34
引用 2 楼 gengzhw 的回复:
要求:必须要正则表达式来实现 
再强调,不要循环,尽量用正则表达式。 楼主要求不清晰?? 

正则玩不转,等高人

帮顶
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:Textarea自动适用高度且无滚动条解决方案
  • Free_Wind22用户头像
  • Free_Wind22
  • ( ⊙ o ⊙ )
  • 等 级:
#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));
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐:纯js网页大型游戏:《神魔对决2-天上的激战》(3.8M),开源发布。
  • Free_Wind22用户头像
  • Free_Wind22
  • ( ⊙ o ⊙ )
  • 等 级:
#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));

 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#7楼 得分:0回复于:2009-05-20 11:13:29
谢谢大哥,高手!
你后面这个正是我想到的优化
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • s_liangchao1s用户头像
  • s_liangchao1s
  • (温故而知新)
  • 等 级:
  • 4

#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>
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#9楼 得分:0回复于:2009-05-20 11:15:19
我刚测试了下;
但是比我的期望效率还是低了点。

一旦循环效率就很低。
因为我的运算量非常大,中间最耗时的就是这个函数。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • dcyhldcyhl用户头像
  • dcyhldcyhl
  • (huanglin)
  • 等 级:
#10楼 得分:0回复于:2009-05-20 11:17:47
好像去重就得要循环匹配,楼主是做啥运算?
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • shenzhenNBA用户头像
  • shenzhenNBA
  • (shenzhenNBA)
  • 等 级:
#11楼 得分:0回复于:2009-05-20 11:21:19
学习了
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#12楼 得分:0回复于:2009-05-20 11:22:31
主要是带循环,效率感觉还是不行,我测试了;
比我原先些的函数执行效率是提高了20%左右。
我希望再优化一下就好了;
再次感谢
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • Free_Wind22用户头像
  • Free_Wind22
  • ( ⊙ o ⊙ )
  • 等 级:
#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));
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#14楼 得分:0回复于:2009-05-20 11:37:56
谢谢,最好这个执行效率有稍微提高;
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#15楼 得分:0回复于:2009-05-20 11:40:11
数字串越长,后面这个效率提供更明显些;

主要还是希望能质的飞跃;如果能提供一倍,我的整个运算将解决5秒钟!!!
期待高手加入!
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • s10275858用户头像
  • s10275858
  • (小小宋)
  • 等 级:
#16楼 得分:0回复于:2009-05-20 12:19:44
神奇的代码,学习了
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • lfywy用户头像
  • lfywy
  • (云中深海)
  • 等 级:
#17楼 得分:0回复于:2009-05-20 12:48:43
学习
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • dh20156用户头像
  • dh20156
  • (风之石)
  • 等 级:
#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>
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • zswang用户头像
  • zswang
  • (伴水 清洁工 看帖要回贴)
  • 等 级:
  • 2

    7

    更多勋章
#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));

 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • zswang用户头像
  • zswang
  • (伴水 清洁工 看帖要回贴)
  • 等 级:
  • 2

    7

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

考虑到这类情况:
alert(dN("0.0123153678422", 2));[/code]
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#21楼 得分:0回复于:2009-05-20 14:04:54
正则效率更高,这个我测试过很多次了。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • xiongzhijian用户头像
  • xiongzhijian
  • (呆呆)
  • 等 级:
#22楼 得分:0回复于:2009-05-20 14:21:28
正则效率并不会比直接循环更快,只是开发效率快而已。正则自身也是需要循环来判断的。 
说得不全面,正则在解析引擎里还是做了优化的..相对循环来说, 还是要快...
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • yangjixiang_hao123用户头像
  • yangjixiang_hao123
  • (要嫁就嫁灰太狼!)
  • 等 级:
#23楼 得分:0回复于:2009-05-20 14:24:55
全是牛人~~寒
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • 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 ;
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • 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);
  });
}
,贴的时候贴错了。

谢谢所有朋友捧场,再见。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • osobo用户头像
  • osobo
  • (osobo)
  • 等 级:
#26楼 得分:0回复于:2009-05-20 15:08:46
自己还发现一个问题。
int.toString()的速度比int+'' 要慢。
int+'' 要快点。
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • abiao5555用户头像
  • abiao5555
  • (abiao5555)
  • 等 级:
#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("");};
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • abiao5555用户头像
  • abiao5555
  • (abiao5555)
  • 等 级:
#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("");}