js相关算法

  1. 传入四个正整数参数,返回最小的两个,代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function sumTwoSmallestNumbers(numbers) {
    var min=Math.min.apply(Math,numbers);
    var filterResult= numbers.filter((item)=>{
    return (item!=min)
    }
    )
    var smin=Math.min.apply(Math,filterResult);
    return min+smin;
    //Code here
    };

最优解(别人代码系列)

1
2
3
4
5
function sumTwoSmallestNumbers(numbers){
numbers = numbers.sort(function(a, b){return a - b; });
return numbers[0] + numbers[1];
};
//使用排序解决。。。。

  1. 给定一个正整数n写成abcd …(a,b,c,d
    …是数字)和一个正整数p,我们想要找到一个正整数k,如果存在的话,比如数字的总和对于p的连续幂的n等于k n。换一种说法:
    例如:(a ^ p + b ^(p + 1)+ c ^(p + 2)+ d ^(p + 3)+ …)= n
    k
    如果是这种情况,我们将返回K,如果不返回-1。
    注:N,P将始终作为严格正整数给出。
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function digPow(n, p){
    // ...
    var s=n.toString();
    var sum =0;
    for(var i=0;i<s.length;i++){
    sum+=Math.pow(s[i],p);
    p++;
    }
    if(sum%n==0) return sum/n;
    else return -1;
    }

最优解(别人代码系列)

1
2
3
4
5
6
7
8
function digPow(n, p) {
var x = String(n).split("").reduce((s, d, i) => s + Math.pow(d, p + i), 0)
return x % n ? -1 : x / n
}
//reduce中s为上一次调用回调函数时的返回值,或者初始值
//d为当前正在处理的数组元素
//i为当前数组元素下标
//初始值为0

  1. 找到n下面所有倍数的总和m,例子:
  • sumMul(2, 9) ==> 2 + 4 + 6 + 8 = 20
  • sumMul(3, 13) ==> 3 + 6 + 9 + 12 = 30
  • sumMul(4, 123) ==> 4 + 8 + 12 + … = 1860
  • sumMul(4, -7) ==> “INVALID”
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function sumMul(n,m){
    //your idea here
    var sum=0;
    var double=1;
    var val=n;
    while(val<m){
    sum+=val;
    double++;
    val=n*double;
    }
    if(sum==0) return "INVALID";
    return sum;
    }

别人代码

1
2
3
4
5
6
7
8
9
function sumMul(n,m){
if (n >= m) return "INVALID";
var sum = 0;
for (var i = n; i < m; i+=n) {
sum += i;
}
return sum;
}
  1. 公差公式,示例如下:
  • arithmetic_sequence_elements(1, 2, 5) == “1, 3, 5, 7, 9”
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function arithmeticSequenceElements(a,r,n) {
    //your code here
    var arr =[];
    var i=0;
    while(arr.length<n){
    if(i==0){ arr[i]=a}
    else arr[i]=' '+a;
    a=a+r;
    i++;
    }
    arr=arr.toString();
    return arr;
    }

别人代码系列:

1
2
3
4
5
function arithmeticSequenceElements(a,r,n) {
var ret = [a]
while (--n) ret.push(a+=r);
return ret.join(', ')
}

  1. 去除!示例如下:
  • remove(“Hi!”) == “Hi!”
  • remove(“Hi!!!”) == “Hi!!!”
  • remove(“!Hi”) == “Hi”
  • remove(“!Hi!”) == “Hi!”
  • remove(“Hi! Hi!”) == “Hi Hi!”
  • remove(“Hi”) == “Hi”

代码如下:

1
2
3
4
5
6
function remove(s){
//coding and coding....
var a=/!+[^!$]/gm;
return s.replace(a," ");
}
//自己的想法,然后有两个没过。

别人代码系列:

1
2
3
4
5
function remove(s){
var a=/!+(?!!*$)/g;
return s.replace(a, '');
}
总体思路是对,不匹配最后的!用零宽负向先行断言,要求接下来的字符不与!匹配

  1. 返回最大和最小,示例如下:
  • highAndLow(“1 2 3 4 5”); // return “5 1”
  • highAndLow(“1 2 -3 4 5”); // return “5 -3”
  • highAndLow(“1 9 3 4 -5”); // return “9 -5”

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
function highAndLow(numbers){
// ...
var arr =numbers.split(/[\ ]+/);
var arr=arr.map(function(item){
return parseInt(item);
})
var max=Math.max.apply(Math,arr);
var min=Math.min.apply(Math,arr);
console.log(max);
return max.toString()+" "+min.toString();
}

别人代码 :

1
2
3
4
function highAndLow(numbers){
numbers = numbers.split(' ').map(Number);
return Math.max.apply(0, numbers) + ' ' + Math.min.apply(0, numbers);
}