【问题标题】:How do I solve this specific algorithm in JavaScript?如何在 JavaScript 中解决这个特定的算法?
【发布时间】:2021-06-25 08:58:56
【问题描述】:

给定这个数组:arr = [ '00011100', '00000001', '00101101', '11111111' ];

如果元素在数组中的偶数位置,我必须从该元素中删除所有具有偶数索引的字符,反之亦然。示例:

第一个元素在偶数位置: arr[0] = '00011100'

第二个元素在奇数位置: arr[1] = '00000001';

我必须删除这些字符并将它们作为连接字符串返回。

整个数组的输出 // 0110 0000 0011 1111

请帮我解决这个问题 :) 提前谢谢你!

let enigma = "";
for(let i = 0; i < arr.length; i++){ 
    let index = arr[i];
    let evenStr = ""; 
    let oddStr = "";
      if(index % 2 === 0) {
         for(let j = 1; j < index.length; j+=2) {
             evenStr += index[j];
         } enigma += evenStr;      
            } else if(index % 2 !== 0) {
         for(let x = 1; x < index.length; x+=2) {
             oddStr += index[x];
         } enigma += oddStr;
    }
}
console.log(enigma) //0110000100111111;

这是我目前的代码,但我收到的输出略有不同:/

【问题讨论】:

  • 您在尝试过的过程中遇到了什么问题?
  • arr[0] = '00011100'。您是否使用zero-based 数组索引来计算哪个在偶数位置,哪个在奇数位置。
  • 你如何计算'00011100'中的evenodd
  • 是的。数组中的第一个元素位于偶数位置。 --> arr[0];
  • 而下一个元素在奇数位置 --> arr[1];

标签: javascript arrays string loops concatenation


【解决方案1】:

这是您问题的潜在解决方案。

使用 reduce()

const removeOddIndex = ( str ) => {
 return str.split("").filter( ( element, index ) => index % 2).join("");
}

const removeEvenIndex = ( str ) => {
 return str.split("").filter( ( element, index ) => !( index % 2 )).join("");
}

const array = [ '00011100', '00000001', '00101101', '11111111' ];

const result = array.reduce( ( acc, cur, index ) => {
  if( index % 2 ) {
    acc[index] = removeEvenIndex( cur );
  } else {
    acc[index] = removeOddIndex( cur );
  }
  return acc;
}, array).join("")

console.log(result)

使用 map()

const removeOddIndex = ( str ) => {
 return str.split("").filter( ( element, index ) => index % 2).join("");
}

const removeEvenIndex = ( str ) => {
 return str.split("").filter( ( element, index ) => !( index % 2 )).join("");
}

const array = [ '00011100', '00000001', '00101101', '11111111' ];

const result = array.map( ( element, index ) => {
  return index % 2 ? removeEvenIndex( element ) : removeOddIndex( element )
} ).join("");

console.log(result)

【讨论】:

  • 答案返回多维数组。您知道如何将最终输出作为连接字符串“0110000000111111”获得。我还不熟悉reduce()
  • 我编辑了我的解决方案,为您提供预期的输出
【解决方案2】:

您可以使用mapsplitjoin 轻松实现此目的

const arr = ["00011100", "00000001", "00101101", "11111111"];

const getEven = (value) =>
  value
    .split("")
    .filter((el, i) => i % 2 === 0)
    .join("");
const getOdd = (value) =>
  value
    .split("")
    .filter((el, i) => i % 2 === 1)
    .join("");

const result = arr
  .map((val, index) => {
    if (index % 2 === 0) return getOdd(val);
    else return getEven(val);
  })
  .join("");

console.log( result );

【讨论】:

    【解决方案3】:

    您可以通过获取外部元素的其余项目和元素的值来进行过滤。

    const
        array = ['00011100', '00000001', '00101101', '11111111'],
        result = array.map(([...a], i) => a.filter((v, j) => i % 2 !== j % 2).join(''));
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2020-11-04
      • 2010-11-01
      • 2020-03-27
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多