CNode

js 面试题,欢迎解答

YyangjiePro发布于13 年前最后回复13 年前25 回复8470 浏览0 收藏

var a = 'lkjgfaoids'; var b = 'adk';

问题: 判断出字符串 b 中的每一个字符,在 a 中是否存在。

这是一个性能优化题,下面的解法性能不够,请提出更好的方案。

解法一:

var as = a.split('');

var bs = b.split('');

for(var i in as){

for(var k in bs){ if(as[i]==bs[k]){ ... } } }

解法二:

var bs = b.split(''); for(var i in bs){ if(a.indexOf(bs[i])){ ... } }

查看回复

回复 (25)

S
shanelau#1·13 年前

有个思路是 先排序,再进行比较, 一次循环就能算出结果

Q
q1270989#2·13 年前

for (var i in a) { console.log(b.indexOf(a[i])) }

我太坏了

X
xiuxu123#3·13 年前

这样呢?


   b.split('').forEach(function(item){
    if(a.localeCompare(item)){
     console.log('%s exits', item);
    }
   });
I
icetoggle#4·13 年前

var map_arr = [] for(var i=0;i<a.length;++i) map_arr[a[i]]=1 for(var i=0;i<b.length;++i) if(map_arr[b[i]]) return true return false 随便写了伪代码,求工作介绍

C
cssfirefly#7·13 年前

var a = 'lkjgfaoids'; var b = 'adk';

问题: 判断出字符串 b 中的每一个字符,在 a 中是否存在。 解法:

var bs = b.split('');

if(a.indexOf(bs[0])){ ... }

if(a.indexOf(bs[1])){ ... }

if(a.indexOf(bs[2])){ ... }

只有三个字母,所以不用循环。还请大家指教。

L
leslie#8·13 年前

var str = 'lkjgfaoids'; var reg = /[adk]/g; var result = reg.exec(str); if(result.length === 3) { return true; }

L
leapon#9·13 年前
引用 icetogglevar map arr = [] for(var i=0;i<a.length;++i) map arr[a[i]]=1 for(var i=0;i<b.length;++i) if(map ...

@kopes18

字符串 b 中的每一个字符,在 a 中是否存在

b 中的每一个字符,都在a中,才返回 true 吧?

I
inmyfree#10·13 年前
引用 q1270989for (var i in a) { console.log(b.indexOf(a[i])) } 我太坏了

可以再优化,外层定义一个数组,初始化为空,,在if里面判断数组中是否存在当前变量a[i],如果存在则说明已经检测过,忽略,否则,添加到数组中,并检查b中是否存在。

I
inmyfree#11·13 年前
引用 q1270989for (var i in a) { console.log(b.indexOf(a[i])) } 我太坏了

en,....看错题意了,是判断每一个....所以if里面要改

K
kopes18#12·13 年前
引用 icetogglevar map arr = [] for(var i=0;i<a.length;++i) map arr[a[i]]=1 for(var i=0;i<b.length;++i) if(map ...

@leapon 恩恩 把return逻辑颠倒一下就行

var map_arr = [] for(var i=0;i<a.length;++i) map_arr[a[i]]=1 for(var i=0;i<b.length;++i) if(!map_arr[b[i]]) return false return true

M
mq1980#14·13 年前

把一个o^2的循环转成2o 优化了不少

C
crossmaya#16·13 年前

取交集不就行了吗。。

P
peiweippww#17·13 年前

用正则表达式吧,它是c直接扩展的,性能高,把b中的字符在a中替换成空,通过长度的变化知道是否在a中出现,不过这样改变了a的值,不知道能否满足你的需求。

P
peiweippww#18·13 年前

如果在a很长的情况下,js的循环肯定没有c的效率高,而且替换成空还有个好处,a的长度会越来越短,循环的次数也会越来越少,性能就越高

P
peiweippww#20·13 年前
引用 peiweippww用正则表达式吧,它是c直接扩展的,性能高,把b中的字符在a中替换成空,通过长度的变化知道是否在a中出现,不过这样改变了a的值,不知道能否满足你的需求。

@alsotang 例如var a = '112233'; a = a.replace( /1/, '' );a现在为'2233',长度发生了变化,就知道1在a中出现过了。我也是给出一种思路,具体性能没测试过,这个题目其实根据a和b的长度的不同方法也可能不一样,我提出的这个比较适合a很长,b在a中出现次数比较多,还可以统计出次数。

J
jmarry#22·13 年前
 var reg=new RegExp(b,'g');
 return reg.test(a);
X
xujun52011#23·13 年前

没测试过性能 var a = 'lkjgfaoids'; var b = 'adk'; var aa = a.split('').sort().join(''); var bb = b.split('').sort(); var reg = new RegExp(bb.join('.*')); console.log(reg.test(aa));

H
hanan198501#24·13 年前

var a = 'lkjgfaoids'; var b = 'adk'; for(var i = 0, len = b.length; i < len; i++) { a.indexOf(b.charAt(i)) > -1 && console.log(b.charAt(i)); }

M
memoryza#25·13 年前

虽然有点长,但是题中的应该是够用的 var findChar = (function() { if(typeof Array.prototype.forEach !== "function") { Array.prototype.forEach = function(callback, thisArgs) { if(typeof callback !== "function") { throw new TypeError('type error'); } var len = this.length, _this = thisArgs || window; for(var i =0; i < len; i++) { callback.call(_this, this[i], i, this); } } } function find(ori, des) { var desArr = []; //slice方法 for (var i = 0,j = des.length; i < j; i++) { desArr.push(des.charAt(i)); } desArr.forEach(function(val) { if(ori.indexOf(val) > -1) { //..... } }) } return find; })(); findChar('lkjgfaoids', 'adk');

参与回复
登录后即可参与回复。登录