我正在对Coderbyte进行挑战,如果对我的问题有任何建议,我将不胜感激:
给我的挑战: “使用JavaScript语言,具有函数ArrayAdditionI(arr) 获取存储在arr中的数字数组,如果,则返回字符串true 数组中任何数字的组合都可以加到等于 数组中的最大数字,否则返回字符串false。 例如:如果arr包含[4,6,23,10,1,3]输出应该 返回true,因为4 + 6 + 10 + 3 = 23.数组不会为空, 不会包含所有相同的元素,并且可能包含负数。 “
我试图解决它的方式:http://jsfiddle.net/reLsg0fg/
function ArrayAdditionI(arr){
var newArr=arr.sort(); // sorted from smallest to largest.
var largestNum=newArr.slice(-1); // Gets the last number, which would be the largest.
var loopArr=arr.sort().pop(); // Takes out the largest number for adding later.
var result=0;
for(var i=0; i<loopArr.length; i++){ // loops through all numbers.
if(result/largestNum !== 1){ //when you divide a number by itself it will be 1.
result+=loopArr[i]; // keep adding each number until get largest number.
}else if(result === largestNum){
return true;
}
}
return false;
}
// TESTS
console.log("-----");
console.log(ArrayAdditionI([4,6,23,10,1,3]));
console.log(ArrayAdditionI([5,7,16,1,2]));
console.log(ArrayAdditionI([3,5,-1,8,12]));
我应该得到真实,虚假,真实。但我得到假,假,假,好像我的循环中出现了问题。 JSFiddle:http://jsfiddle.net/reLsg0fg/
我将不胜感激任何建议。谢谢^^
答案 0 :(得分:1)
使用
排序数组arr.sort(function (a, b) { return a - b })
答案 1 :(得分:1)
这可能不是完整的解决方案,但这里是JavaScript-Problems:
largestNum
是您算法中的数组
.sort()
无效
function ArrayAdditionI(arr){
var largestNum = Math.max.apply(0, arr); // Gets the last number, which would be the largest.
arr.sort(function(a, b){return a-b})
arr.pop(); // Takes out the largest number for adding later.
var result=0;
同样使用if(result !== largestNum) {
,分区很昂贵,并且浮点数可能会产生意外结果。
这就是你的JavaScript。但我很确定算法是错误的 - 但我认为这取决于你
请注意,示例[4, 6, 23, 10, 1, 3] => 4 + 6 + 10 + 3 = 23
不仅仅是将最低值加到最大值来尝试匹配它。
答案 2 :(得分:1)
问题解决方案的一个可能示例。
这是如何运作的:
- 首先对所有项目进行排序
- 将第一个元素移至
largest
- 使用简化数组调用递归函数
y
,最大值和包含成功添加项的空数组的变量。递归函数基本上分两部分工作
- 测试剩余总和是否为零,如果是,则实现结果并返回
true
,完成该功能。- 如果没有遍历数组并且
- 从数组中复制
- 使用
从该位置获取值splice
- 测试,如果值小于或等于剩余总和以及
y
对短路数组的调用结果,总和减去值以及带有已使用项目和实际项目的新数组。- 如果true返回true并完成功能。
- 如果在返回
醇>false
之前没有完成。
function x(array) {
function y(a, s, result) {
var aa, i, v;
if (s === 0) {
document.write('<pre>result: ' + JSON.stringify(result, 0, 4) + '</pre>');
return true;
}
for (i = 0; i < a.length; i++) {
aa = a.slice();
v = aa.splice(i, 1)[0];
if (v <= s && y(aa, s - v, result.concat(v))) {
return true;
}
}
return false;
}
var largest,
r = [];
array.sort(function (a, b) { return b - a; });
largest = array.shift();
document.write('largest value: ' + largest + '<br>');
return y(array, largest, r);
}
document.write(x([4, 6, 23, 10, 1, 3]) + '<hr>');
document.write(x([5, 7, 16, 1, 2]) + '<hr>');
document.write(x([3, 5, -1, 8, 12]));
&#13;
答案 3 :(得分:0)
我试图用for循环解决这个问题,但我错过了挑战的事实 并不是要求所有数字都需要加起来等于最大数量,但也有可能 如果我们拿出一些数字,加起来就是最大的数字。因此我决定用递归来解决。
提示:
* Math.max.apply()方法接受一个数组并返回最大的数字。请注意,它通常作为Math.max()在字符串上工作
* sort()方法可以使用参数来进一步扩展它的目的。通常它只
对字符串进行排序,但是为了对数字进行排序,我们包含一个查找哪个数字更大的函数
*首先得到最大的数字
*对数组进行排序,然后删除用于递归的最大数字
*创建一个递归函数,检查数字是否加起来最大数字,如果没有,检查数组中的某些数字是否从最大数字中减去它们等于最大数字。
function ArrayAdditionI(array){
var largestNum = Math.max.apply(0, array); // gets the largest number in array.
array.sort(function(a,b){ return a-b;}).pop(); // sorts array and removes last(largest) number.
function recursionCheck(arr, sum){
// the base case when array empty.
if(arr.length === 0){
return sum === 0;
}
var arrBeginNum=arr[0];
// for every recursion take away one number(the first one in this case).
arr = arr.slice(1);
// first check if numbers sum up to largest num if not, check if removing numbers adds up to largest num.
return recursionCheck(arr, sum) || recursionCheck(arr, sum - arrBeginNum);
}
// recursion needs to be called for it to start.
return recursionCheck(array, largestNum);
}
// TESTS
console.log("-----");
console.log(ArrayAdditionI([1,2,3,5,4])); ==> true
console.log(ArrayAdditionI([21,10,12,9,2])); ==> true
console.log(ArrayAdditionI([4,6,23,10,1,3])); ===> true
console.log(ArrayAdditionI([5,7,16,1,2])); ===> false
console.log(ArrayAdditionI([3,5,-1,8,12])); ===> true