遍历数组中的元素并查找出现的次数并添加其他元素并推入新数组

时间:2019-02-22 15:08:53

标签: javascript arrays algorithm

大家好,我正在尝试解决由三部分组成的javascript问题。我在解决第2步和第3步时遇到问题。Perce,这不是家庭作业,但这是我在工作中要解决的问题,所以对我来说,这有点像“家庭作业”。

步骤1:计算元素(0)在数组上出现多少次 OK

第2步:从左到右添加每个值,然后推入新数组此处有困难

第3步:打印具有结果的新数组此处有困难

例如:

let a = [1, 2, 0, 0, 3, 4, 0, 1];
Step 1: 0 // => 3 times
Step 2: [1+2, 0, 3+4, 0, 1];
Step 3: let newArry = [3, 0, 7, 0, 1] // => Resulting array

/* Algorithm exercise:
*
*  Step 1: count how many times an element (0) appears on an array // => 0 appears 3 times
*  Step 2: Add each value that's not (0) from left to right and push to a * *new array
*  Step 3: Resulting array should be: let newArry = [3, 0, 7, 0, 1]
*  Explanation : [1+2, 0, 3+4, 0, 1];
*
*/

// Step 1: 1st try 
let a = [1, 2, 0, 0, 3, 4, 0, 1];
let counts = {};


for (let i=0; i < a.length; i++) {
	let num = a[i];
	console.info(`This is num now: ${num}`);
  
 
 	counts[num] = counts[num] ? counts[num] + 1 : 1;
  
  console.info(`This is counts now after looping # ${i}: ${JSON.stringify(counts, undefined, 2)}`);
}

  console.table(`This is counts now: ${counts[0]}`);


// Step 1: 2nd try
let search = 0;
let occurences = a.filter(value => value === search).length;

console.info(`Found ${search} occuring ${occurences} times`);

谢谢。

2 个答案:

答案 0 :(得分:2)

步骤1:计算元素(0)在数组中出现的次数

console.log([1, 2, 0, 0, 3, 4, 0, 1].filter(element => element===0 ).length);

第2步和第3步

const array = [1, 2, 0, 0, 3, 4, 0, 0, 0, 1, 0 ];

const result = array.reduce((prev, current) => {
  if (current) {
    if (prev[prev.length-1]) prev[prev.length-1]+=current;
    else prev.push(current);
  }
  else if (prev[prev.length-1] || prev.length===0) prev.push(current);
  return prev
}, []);

console.log(result);

答案 1 :(得分:1)

在这个答案中,我们将编写puzzle来像这样工作-

const q =
  0

puzzle
  ( q
  , [ 1, 2, 0, 0, 3, 4, 0, 1 ]
  , printf (`${q} appeared %s times. The result is %s`)
  )
  // 0 appeared 3 times. The result is 3,0,7,0,1

puzzle
  ( q
  , [ 1, 2, 0, 0, 3, 4, 0, 0, 0, 5, 6, 7, 8, 0 ]
  , printf (`${q} appeared %s times. The result is %s`)
  )
  // 0 appeared 6 times. The result is 3,0,7,0,26,0

puzzle
  ( 5
  , [ 1, 2, 0, 0, 3, 4, 0, 0, 0, 5, 6, 7, 8, 0 ]
  , printf (`5 appeared %s times. The result is %s`)
  )
  // 5 appeared 1 times. The result is 10,5,21

我可以分享这一点,因为它可以教给您很多知识,但您的老师不太可能接受;不是因为它是一个不好的程序,而是初学者不可能自己编写它。

此程序的独特之处在于,它仅通过输入数组一次即可同时完成所有3个步骤-

const None =
  Symbol ('None')

const puzzle = (query, [ a = None, b = None, ...rest ], then) =>
  a === None                     # 1
    ? then (0, [])

  : b === None                   # 2
    ? then
        ( Number (query === a)
        , [ a ]
        )

  : query === a && query === b   # 3
    ? puzzle
        ( query
        , [ b, ...rest ]
        , (count, result) =>
            then
              ( count + 1
              , result
              )
        )

  : query !== a && query !== b   # 4
    ? puzzle
        ( query
        , [ a + b, ...rest ]
        , then
        )

  : puzzle                       # 5
      ( query
      , [ b, ...rest ]
      , (count, result) =>
          then
            ( count + Number (query === a)
            , [ a, ...result ]
            )
      )

puzzle被定义为使用mathematical induction的递归函数,在该函数中,我们以特定方式对要处理的值进行推理。请参阅上面的编号注释,因为我们在下面将其细分:

  1. (基本)当我们没有a时,表示输入是一个 empty 数组;没有什么可计数的,没有值可加在一起,没有重复的值可折叠。在这种情况下,返回 empty 结果:0用于计数,[]用于输出数组。

  2. (归纳法:a不是无)当我们有a但没有b时,这意味着我们只剩下一项; singleton 数组。在这里,我们不能将两个值加在一起或折叠重复的值,因为我们只有一个一个值。在这种情况下,返回 singleton 结果:Number (query === a)作为计数,将布尔值转换为数字,并返回 singleton 输出数组{{1} }

  3. (归纳式:[ a ]不是无,a不是无)当我们有一个b和一个a时,这意味着我们有足够的值来开始处理函数的更复杂的操作。我不想添加与查询匹配的数字,也不想在结果中添加b,如果它是重复项,那么我必须先检查一下。当查询同时匹配a a时,发现重复。在这种情况下,请在没有b的情况下重复拼图。当我们得到较小谜题的结果时,我们使用a来增加计数,因为我们的查询与count + 1相匹配。此代码分支处理重复元素的移除,因此没有新内容要添加到输出数组a

  4. (归纳法:result不是全无,a不是全无,b两者都不匹配)我们有一个{{1 }}和query,并且查询均与两者不匹配。如果它与都不匹配,那么我们知道可以将ab加在一起。在这种情况下,请用a重复拼图。由于查询也不匹配,因此我们知道没有要更新的内容。输出数组也保持不变,因为我们创建的新数字可能会在出现在输出中之前被添加到更多的相邻元素中。因为ba + b在此代码分支中未更改,所以count被直接传递。

  5. (归纳法:result不为空,then不为空,a匹配bquery)< / strong>我们有一个a和一个b,我们知道查询匹配一个。哪一个匹配并不重要;值不能重复,也不能删除,也不能将值加在一起。在这种情况下,用a重复拼图,如果b与查询匹配,则增加计数,并在结果前加上b。这是唯一将值插入输出数组的代码分支。


a出于演示目的定义为-

a

展开以下代码段,以在您自己的浏览器中验证结果-

printf