[6kyu]FizzBuzz++
2017-07-19 本文已影响28人
君肄塵
该算法题来自于 codewars【语言: javascript】,翻译如有误差,敬请谅解~

- 相关题型 [7kyu]Fizz Buzz
- 需要面试者实现一个函数 FizzBuzz,它的工作原理如下:对于1到100之间的数字,如果是3的倍数替换为
fizz
,如果它是5的倍数替换为buzz
,同时可被3和5整除则替换为fizzbuzz
。
- 需要面试者实现一个函数 FizzBuzz,它的工作原理如下:对于1到100之间的数字,如果是3的倍数替换为
- 面试官惊讶于你的能力,给你一个更难的问题。
- 任务
- 给出一个互质数数组(即所有数字只能被自己和1整除)和一个长度相同的单词数组。计算其fizzbuzz表示,直到单词数组中的单词被全部使用。
- 注意:
1.如果元素的索引是从1开始,则第10个元素是 fizz + bazz ==> 10%2==0 和 10%5== 0 。
2.返回数组的长度应为互质数组中元素的乘积。
3.这些字符串在数组的外观上始终从左到右连接。
4.假设第一个数组中的所有数字将始终是互质的,不需要进行验证。 - 例如:
fizzbuzz_plusplus([2, 3, 5], ['fizz', 'buzz', 'bazz']); // => [1, 'fizz', 'buzz', 'fizz', 'bazz', 'fizzbuzz', 7, 'fizz', 'buzz', 'fizzbazz', 11, 'fizzbuzz', 13, 'fizz', 'buzzbazz', 'fizz', 17, 'fizzbuzz', 19, 'fizzbazz', 'buzz', 'fizz', 23, 'fizzbuzz', 'bazz', 'fizz', 'buzz', 'fizz', 29 , 'fizzbuzzbazz']
- 解答
- 其一
// [...Array(n+1).keys()].slice(1) 可以获取1-n的连续数字
function fizzbuzzPlusPlus(numbers, words) {
let nums = [...Array(numbers.reduce((sum,value) => sum * value,1)+1).keys()].slice(1);
return nums.map(el => {
let result;
for (let i=0;i<numbers.length;i++){
if (!(el%numbers[i])){
result ? result+=words[i] : result=words[i];
}
}
return result ? result : el;
})
}
- 其二
function fizzbuzzPlusPlus(n, w) {
return [...Array(n.reduce((a,b)=>a*b)).keys()].map((x)=>{
let b=n.map((e,i)=>(x+1)%e==0 ? w[i] :'').filter(x=>x!=='')
if(b.length==0) return x+1
return b.join('')
});
}
- 其三
function fizzbuzzPlusPlus(nums, words) {
return Array
.from({length: nums.reduce((a,b) => a * b, 1)})
.map((_,i) => nums
.filter(v => (i + 1) % v === 0)
.map(v => words[nums.indexOf(v)])
.join('') || i + 1
);
}
- 其四
function fizzbuzzPlusPlus(numbers, words) {
let result = [];
for (let i = 1, total = numbers.reduce((p, c) => p * c); i <= total; i++) {
result.push(numbers.reduce((p, c, u) => i % c === 0 ? p + words[u] : p, "") || i);
}
return result;
}