网易2018春招笔试题解
第一题:
参考代码
let dir=["N","E","S","W"]; let turn="LRR"; let k=0; for(let i=0;i<turn.length;i++){ if(turn[i]=="L"){ k+=3; }else{ k++; } } k=k%4; console.log(dir[k]);
第二题:
题目分析,暴力破解会超时,所以需要点数学,我们来找找规律。
对于 n=12345,k=2
模1 得000(00) 大于k的有0个
模2 得1010) 大于k的有0个
模3 得12012 大于k的有2个
模4 得12301 大于k的有2个
模5 得12340 大于k的有3个
看不出来?加下括号 模1 得(0)(0)(0)(0)(0) 大于k的有0个
模2 得(10)(10)1 大于k的有0个
模3 得(120)12 大于k的有2个
模4 得(1230)1 大于k的有2个
模5 得(12340) 大于k的有3个
也就是
模i 为(0...i-1)(0....i-1)(0...n%i) 每个(0...i-1)有i-k个数符合要求,有n/i个(0...i-1),,而最后的那个尾巴只有n%i-k+1个数符合要求
注意:i要从k+1算起,当i<k时,i-k<0了,会减少总数,i=k时,i-k=0没必要算进去总数
嗯,可以动手写代码了
参考代码:
let n=5,k=2; let count=0; if(k==0){ count=n*n; }else{ for(let i=k+1;i<=n;i++){ count+=~~(n/i)*(i-k); if(n%i>=k){ count+=n%i-k+1; } } } console.log(count);
第三题:
题目分析:
这题用O(n)都有可能会超时,只能看规律了,但是规律也是有其数学性的,而这题的之所以有规律就是相邻的数字相差为1.
当k mod 3=0时,能整除3,当k mod 3=2时也能整除3,因为 k的前一个数(k-1)mod3=1,两个余数想加是3,所以k+(k-1)是可以整除3的
所以这是一道数学题。。。。
参考代码
let l=2,r=5; let count=0; for(let k=l;k<=r;k++){ if(k%3==0||k%3==2){ count++; } } console.log(count);