!!求正则表达式!高分求一去重复数字串的正则表达式,在线等;请高手帮忙;

osobo 2009-05-20 10:25:45
高分求一去重复数字串正则表达式,在线等;请高手帮忙;

问题:一小数或者整数,比如-0.233641464278
去(小数点 、负号、有效数字前的0);
返回指定长度(0-5)的不重复的字符串,原串顺序不变,比如长度为4,那么返回的串应该是'2364'。

要求:必须要正则表达式来实现,不允许使用循环;返回最长长度为5.

若函数为
function dN(num,len){
return (处理后的num字符串,长度为len)
}

则 dN(-0.303545,3)='305';
dN(33766545,4)='3765';

再强调,要求高效率执行,不要循环,尽量用正则表达式。


...全文
801 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
abiao5555 2012-03-01
  • 打赏
  • 举报
回复

function dN(num, len){
return num.toString().replace(/-?0?\.0*/, "").match(/(?:\d)(?!\1)+/g).slice(0,len).join("");
}


改为非捕获
abiao5555 2012-03-01
  • 打赏
  • 举报
回复


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("");
};

lfywy 2009-05-20
  • 打赏
  • 举报
回复
学习
s10275858 2009-05-20
  • 打赏
  • 举报
回复
神奇的代码,学习了
osobo 2009-05-20
  • 打赏
  • 举报
回复
数字串越长,后面这个效率提供更明显些;

主要还是希望能质的飞跃;如果能提供一倍,我的整个运算将解决5秒钟!!!
期待高手加入!
osobo 2009-05-20
  • 打赏
  • 举报
回复
谢谢,最好这个执行效率有稍微提高;
2009-05-20
  • 打赏
  • 举报
回复
再优化了一下, 不知道用哈希效率怎么样, 期待高手出现.


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 2009-05-20
  • 打赏
  • 举报
回复
主要是带循环,效率感觉还是不行,我测试了;
比我原先些的函数执行效率是提高了20%左右。
我希望再优化一下就好了;
再次感谢
shenzhenNBA 2009-05-20
  • 打赏
  • 举报
回复
学习了
dcyhldcyhl 2009-05-20
  • 打赏
  • 举报
回复
好像去重就得要循环匹配,楼主是做啥运算?
osobo 2009-05-20
  • 打赏
  • 举报
回复
我刚测试了下;
但是比我的期望效率还是低了点。

一旦循环效率就很低。
因为我的运算量非常大,中间最耗时的就是这个函数。
s_liangchao1s 2009-05-20
  • 打赏
  • 举报
回复

<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 2009-05-20
  • 打赏
  • 举报
回复
谢谢大哥,高手!
你后面这个正是我想到的优化
2009-05-20
  • 打赏
  • 举报
回复
这个效率要好点...


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));

2009-05-20
  • 打赏
  • 举报
回复
我这个还是用了循环


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));
Dora 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gengzhw 的回复:]
要求:必须要正则表达式来实现
再强调,不要循环,尽量用正则表达式。 楼主要求不清晰??

正则玩不转,等高人
[/Quote]
帮顶
osobo 2009-05-20
  • 打赏
  • 举报
回复
我的意思是不用循环语句(for,while等)来实现,直接用正则表达式实现
gengzhw 2009-05-20
  • 打赏
  • 举报
回复
要求:必须要正则表达式来实现
再强调,不要循环,尽量用正则表达式。 楼主要求不清晰??

正则玩不转,等高人
sunxing007 2009-05-20
  • 打赏
  • 举报
回复
帮顶!
等高手!
osobo 2009-05-20
  • 打赏
  • 举报
回复
自己还发现一个问题。
int.toString()的速度比int+'' 要慢。
int+'' 要快点。
加载更多回复(8)

87,924

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧