1.位计数(Bit Counting)

描绘:编写一个函数,该函数将整数作为参数,并回来在该数字的二进制表明方式中等于 1 的位的个数。您能够保证输入对错负数。

示例:1234(10011010010) -> 5

思路解析:

先将作为输入的整形参数转化为二进制数,由于对错负数,所以不需求考虑补码的问题。将10进制数转化为2进制数能够从低位到高位一点一点得到这个数。示例中的10011010010 = 2^10 + 2^7 + 2^6 + 2^4 + 2^1 = 1024 + 128 + 64 + 16 + 2 = 1234。

10进制转2进制能够参阅以下流程: 18 => 10010
18 % 2 = 0; (18 - 1*0)/2 = 9;  最低位为0
9 % 2 = 1; (9 - 1*1)/2 = 4;  第二位为1
4 % 2 = 0; (4 - 0)/2 = 2; 第三位为0
2 % 2 = 0; 2/2 = 1; 第四位为0
1 % 2 = 1; 0/2 = 0; 最高位为1

这样得到了整形参数的二进制字符串,就能够遍向来取得这个字符串里含有1的个位数的个数了。

代码

var countBits = function(n) {
  let currentnum = n;
  let bit;
  let counter = 0;
  while(currentnum>0){
    bit = currentnum % 2;
    if(bit === 1)counter++;
    currentnum = (currentnum - bit)/2;
  }
  return counter;
};

需求留意的是,假如运用位运算符>>或许会导致精度丢掉,如运用 currentnum = currentnum >> 1; 代替 currentnum = (currentnum - bit)/2; 这是由于js在对整数进行位运算时会运用32位2进制数,导致高位丢掉。

2.核算重复项(Counting Duplicates)

描绘:编写一个函数,该函数将回来输入字符串中呈现一次以上的字符或数字的个数。不区分大小写,能够假定输入字符串仅包括字母(大写和小写)和数字。

示例:
“abcde” -> 0
“aabbcde” -> 2
“aabBcde” -> 2
“indivisibility” -> 1
“Indivisibilities” -> 2
“aA11” -> 2
“ABBA” -> 2

思路解析:

本题有点像 Isograms 的进阶版,能够用字典来处理。别离记载各种字母和数字的个数,然后遍历字典,假如个数大于1就让计数器加1,然后回来计数器的值就行了。留意统计字母个数之前要把字符串toLowerCase一下变满意小写字母的字符串。

代码

function duplicateCount(text){
  let dictionary = [];
    let textarray = text.toLowerCase().split('');
    let counter = 0;
    for(let i = 0 ; i<textarray.length;i++){
      if(typeof(dictionary[textarray[i]]) == 'undefined'){
        dictionary[textarray[i]] = 1;
      }else{
        dictionary[textarray[i]] += 1;
      }
      if(dictionary[textarray[i]] === 2)counter++;
    }
  return counter;
}

这儿遍历字符串,将没有的字母或数字写进字典dictionary中,假如之前呈现过就在之前基础上加1,假如这个字母或数字呈现了2次,核算器加1。留意不要重复计数,呈现第三次及以上时计数器不用加了。

3.查找奇偶校验反常值(Find The Parity Outlier)

描绘:给你一个包括整数的数组(长度至少为 3,但或许非常大)。数组有两种状况,一种根本满是奇数但包括一个偶数,一种根本满是偶数但包括一个奇数。回来这个方枘圆凿的反常数字的值。

示例:
[2, 4, 0, 100, 4, 11, 2602, 36] -> 11
[160, 3, 1719, 19, 11, 13, -21] -> 160

思路解析:

本题首先要确定反常值的类型,然后遍历数组就能够找到反常值了。能够先记载数组中奇数和偶数的个数,哪种数的个数为1哪种数便是反常值类型。

代码

function findOutlier(integers){
  var arr = integers;
  var oddcounter = 0;
  var evencounter = 0;
  for(let i = 0;i<arr.length;i++){
    if(arr[i]%2 === 0){
      evencounter++;
    }else{
      oddcounter++;
    }
  }
  if(evencounter === 1){
    for(let i = 0;i<arr.length;i++){
      if(arr[i]%2 === 0) return arr[i];
    }
  }else{
    for(let i = 0;i<arr.length;i++){
      if(arr[i]%2 !== 0) return arr[i];
    }
  }
}

需求留意的是数组中的数字或许为负数,负奇数模2的余数为-1。所以判别一个数是否为奇数应该判别它模2余数是否不为0。

4.皮特,面包师(Pete, the baker)

描绘:皮特喜欢烤一些蛋糕。他有一些食谱和成分。不幸的是,他的数学欠好。你能帮他找出来,考虑到他的食谱,他能烤多少蛋糕吗?

编写一个函数,该函数的参数为配方(目标)和可用成分(也是一个目标),并回来 Pete 能够烘焙的最大蛋糕数(整数)。为简单起见,没有数量单位(例如,1磅面粉或200克糖只是1或200)。物体中不存在的成分能够被视为 0。

示例:
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200}); // 回来 2
cakes({apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000});// 回来 0

思路解析:

这儿考查了json目标的运用,经过for in来遍历json目标。遍历配方的json目标,然后每次在可用成分中找到对应的成分的含量,将可用成分/配方成分可用成分/配方成分的商记载到一个数组里面,数组中最小的值便是答案。一起假如在可用成分中没找到配方需求的成分,就回来0。

代码

function cakes(recipe, available) {
  let arr = [];
  let result = 0;
  for(let recipeitem in recipe){
    if(typeof(available[recipeitem]) !== "undefined"){
      arr.push(available[recipeitem]/recipe[recipeitem])
    }else{
      arr.push(0);
    }
  }
  result = arr[0];
  for(let i = 0;i<arr.length;i++){
    if(arr[i] === 0) return 0;
    if(result > Math.floor(arr[i]))result = Math.floor(arr[i])
  }
  return result;
}

这儿留意typeof(available[recipeitem]) !== "undefined"的undefined要用字符串,这是由于typeof的回来值类型为string。我们能够打印一下这个类型:console.log(typeof(typeof("test"))) //string

5.函数核算(Calculating with Functions)

描绘:界说一些函数,这些函数需求满意以下条件:

  • 从 0(“零”)到 9(“九”)的每个数字必须有一个函数
  • 以下每个数学运算都必须有一个函数:加、减、乘、除以
  • 每个核算只包括一个运算和两个数字
  • 最外层函数表明左操作数,最内层函数表明右操作数
  • 除法应为整数除法。比如13应该回来0。

    示例:
    seven(times(five())); // must return 35
    four(plus(nine())); // must return 13
    eight(minus(three())); // must return 5
    six(dividedBy(two())); // must return 3

思路解析:

看描绘或许没看明白,看下编辑框就知道要干啥了。

Codewors刷题思路分享——js篇2
便是让界说这14个函数,然后满意加减乘除的需求就能够了。
仔细看实例,发现加减乘除的函数的参数只有数字函数一种状况,而数字的参数有两种状况(符号函数或许啥也没有)。

  • 符号函数根本就确定了,它需求回来的值便是符号的类型和它参数上的数字,很自然能想到用字符串或许数组保存这些回来值。
  • 而数字函数的参数假如为数组,那么阐明它是最外层的函数,需求拿到参数进行核算;假如啥也没有,那么就回来对应的值就行了。

代码

function zero(args) {return number(0,args)}
function one(args) {return number(1,args)}
function two(args) {return number(2,args)}
function three(args) {return number(3,args)}
function four(args) {return number(4,args)}
function five(args) {return number(5,args)}
function six(args) {return number(6,args)}
function seven(args) {return number(7,args)}
function eight(args) {return number(8,args)}
function nine(args) {return number(9,args)}
function plus(arg) {return symbol(0,arg)}
function minus(arg) {return symbol(1,arg)}
function times(arg) {return symbol(2,arg)}
function dividedBy(arg) {return symbol(3,arg)}
function number(n,args){
  if(typeof(args) === "object"){
    switch(args[0]){
      case 0:return n + args[1];
      case 1:return n - args[1];
      case 2:return n*args[1];
      case 3:return Math.floor(n/args[1]);
    }
  }else{
    return n;
  }
}
function symbol(n,arg){
  let arr = [];
  arr.push(n);
  arr.push(arg)
  return arr;
}

这儿能够发现js这种弱类型言语的的一个特色,便是形参假如没有的话也不会报错,由于js会自动给形参一个undefined的值。

function a(arg){
  console.log(typeof(arg))
}
a();//undefined

一起在调查高手的题解的时候发现了一个现象,便是js在运行函数时假如参数中嵌套了函数,那么它会以一种相似递归的方式来运行这些函数。

function a(arg){
  console.log('a');
}
function b(arg){
  console.log('b');
}
function c(arg){
  console.log('c');
}
function d(arg){
  console.log('d');
}
c(b(a())) //a b c
c(b(a()),d()) //a b d c

这是一个比较精简漂亮的题解 Calculating with Functions (JavaScript)