使用while / for读取两行输入

时间:2019-06-17 22:04:01

标签: javascript node.js

所以,我遇到了两行输入的问题

输入: 4 6 | 6 9

输出: 2 | 15

(“ |”将是换行符)

但是我不知道我应该怎么读这两行

我尝试使用for,限制i <2; 它会给我正确的答案,但是如果输入多于2行,它将无法工作(很明显); 所以我想知道我需要使用(while / for)以及如何使用

var lines = input.split('\n');

for(i = 0; i < 2; i++){
    var nums = lines[i].split(" ");

    var n1 = Number(nums[0]);
    var n2 = Number(nums[1]);

    var mofiz = n1 ^ n2;

    console.log(mofiz);
}

5 个答案:

答案 0 :(得分:1)

您的代码总体来说还不错,您只需要将计数器“ i”的限制定义为数组“ lines”的长度即可:

const input = "2 3\n2 5\n6 7"


var lines = input.split('\n');

//you should always define your variables, even in a loop
for(let i = 0; i < lines.length; i++){
    var nums = lines[i].split(" ");

    var n1 = Number(nums[0]);
    var n2 = Number(nums[1]);
    
    //just so you know you are performing a logical xor, and not an exponentiation which is ** (a**b or Math.pow(a, b))
    var mofiz = n1 ^ n2;

    console.log(mofiz);
}

答案 1 :(得分:0)

while循环和for循环是等效的。这两个版本的代码将执行完全相同的操作:

for循环版本:

var lines = input.split('\n');

for(i = 0; i < lines.length; i++){
    var nums = lines[i].split(" ");

    var n1 = Number(nums[0]);
    var n2 = Number(nums[1]);

    var mofiz = n1 ^ n2;

    console.log(mofiz);
}

while循环版本:

var lines = input.split('\n');

i = 0;
while(i < lines.length){
    var nums = lines[i].split(" ");

    var n1 = Number(nums[0]);
    var n2 = Number(nums[1]);

    var mofiz = n1 ^ n2;

    console.log(mofiz);
    i++;
}

对于您的实际问题:您需要使用length属性(lines.length)来确定循环应运行多少次。

答案 2 :(得分:0)

如果只需要前两行,则可以简单地将它们从数组中解构。

const [firstLine, secondLine] = input.split('\n');
console.log('First:', firstLine);
console.log('Second:', secondLine);
// now go calculate the `mofiz` thing, whatever it is.

无论如何,如果您想遍历所有行,则可以使用lines.forEachmap或任何适合您的内容,例如要打印,请使用forEach

const lines = input.split('\n');
lines.forEach(line => {
  const [firstNumber, secondNumber] = line.split(' ');
  const mofiz = firstNumber ^ secondNumber;
  console.log(mofiz);
});

或者,如果您只想计算所有mofiz的东西,并将它们一起打印到其他位置,则可以使用map

const lines = input.split('\n');
const mofizes = lines.map(line => {
  const [firstNumber, secondNumber] = line.split(' ');
  return firstNumber ^ secondNumber;
});
console.log(mofizes); // prints "[2, 15]"

答案 3 :(得分:-1)

这可能是做自己想要的事情的正确方法之一(如下所述):

'use strict';

let i = 0;
let length = null;
let input = `
1 0
1 1
0 0
0 1
`;
let val = 0;
let chr = '';
let count = 0;

input = input.split(/(?=[\s\S])/u);
length = input.length;

while (i < length) {
    if (input[i] !== '\n') {
        if (input[i] !== ' ') {
            chr += input[i];
        } else if (chr !== '') {
            count++;
            val ^= parseInt(chr);
            chr = '';
        }
    } else {
        if (chr !== '') {
            val ^= parseInt(chr);
            chr = '';
        }
        if (count > 0) {
            console.log(val);
            count = 0;
            val = 0
        }
    }
    i++;
}

// OUTPUT:
//  1
//  0
//  0
//  1

基本上,我使用input = input.split(/(?=[\s\S])/u);按每个字符分割整个输入,然后在一次扫描中动态处理数组。

  1. 创建更少的变量并在循环外对其进行初始化可以提高性能(内存和速度)。
  2. 强烈建议不要使用Number()构造函数在JavaScript中生成数字,与直接基元用法或其他方法相比,它具有糟糕的性能,并且在与其他元素进行比较时可能会导致问题。在这种情况下,请改用parseInt()
  3. 正如其他用户所说,使用Array.length是获得迭代次数的方法。
  4. 这样编写,您的代码就较少依赖语法。它将能够使用多个空格处理更长的行,并执行其他操作(通过仅将'^=''*=''**=''+=''-='一起更改等)

最后编辑(为简单起见,请参见先前版本)

  • for替换为while
  • 接受多位数字(例如:42 3 19)

答案 4 :(得分:-2)

按照OP问题标题:

  

使用while / for只能读取两行输入

您不需要循环即可完成如此简单的任务。

    var INSTR = '0 1 2\n3 4 5\n6 7 8\n9 ...';
    var lines = /^([^\n]*)\n([^\n]*)/.exec(INSTR);
    console.log(lines[1]);
    console.log(lines[2]);