Как исправить значение "let i = 0" в циклах for для снова после 0 после завершения цикла? - PullRequest
0 голосов
/ 25 мая 2019

Поэтому я использую цикл for с let i = 0 в качестве счетчика после того, как значение i передаст максимальное значение в for пример циклов:

for(let i = 0; i < 60; i++)

Максимальное значение 59. Значение i снова возвращается к 0. Что не так с кодом?

Я отлаживаю с помощью console.log(), чтобы проверить значение в каждом цикле и массиве, но я все еще не понимаю, почему значение i возвращается обратно к 0 и начинается цикл снова.

function findLongestWordLength(str) {
  let val = 0;
  let valu = [];

  // Make an array contain every word length 
  for (let i = 0; i < str.length; i++) {
    let a = str.split("")[i];

    if (a == " ") {
      valu.push(val);
      val = 0;
    } else {
      val++;
    }
    
    console.log(i);
  }
  
  val = 0;

  // Search for the max value 
  for (let i = 0; i < valu.length; i++) {
    if (valu[i] > val) {
      val = valu[i];
    }
  }

  return val;
}

findLongestWordLength("What if we try a super-long word such as otorhinolaryngology");
console.log(findLongestWordLength("What if we try a super-long word such as otorhinolaryngology"));

И это результат в консоли:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

Я ожидаю, что на выходе будет 19, но на самом деле будет 4

Ответы [ 4 ]

3 голосов
/ 25 мая 2019

Проблема в вашем коде состоит в том, что последняя строка не будет добавлена ​​в массив valu, потому что для добавления к длине valu условие массива if (a === " ") должно быть true. Последнее слово никогда не сбывается, потому что после него нет " ".

Вы должны добавить val в valu после завершения цикла. Смотрите приведенный ниже фрагмент.

function findLongestWordLength(str) {
  let val = 0;
  let valu = [];
  let arr = str.split('');
  // Make an array contain every word length 
  for (let i = 0; i < str.length; i++) {
    let a = arr[i];

    if (a === " ") {
      valu.push(val);
      val = 0;
    } else {
      val++;
    }
  }
  valu.push(val) // this line is only added line by me.
  val = 0;

  // Search for the max value 
  for (let i = 0; i < valu.length; i++) {
    if (valu[i] > val) {
      val = valu[i];
    }
  }

  return val;
}

findLongestWordLength("What if we try a super-long word such as otorhinolaryngology");
console.log(findLongestWordLength("What if we try a super-long word such as otorhinolaryngology"));

Максимальное значение равно 59. Значение i снова возвращается к 0. Что не так с кодом?

Поскольку переменная i является локальной переменной, и каждый цикл времени начинает инициализироваться значением 0.

лучше

Простой код - это split() строка на " ", а затем map() это length каждого слова и затем передача его в Math.max() с использованием синтаксиса распространения

function findLongestWordLength(str) {
  return Math.max(...str.split(' ').map(x => x.length))
}

console.log(findLongestWordLength("What if we try a super-long word such as otorhinolaryngology"));
1 голос
/ 25 мая 2019

Добавьте эту строку после цикла for:

valu.push(val);

Вы получили неправильный ответ, так как последний "val" не добавляется в массив в последнем цикле. Будьте осторожны, если я меньше длины str и вашего условия if.

function findLongestWordLength(str) {
  let val = 0;
  let valu = [];

  // Make an array contain every word length 
  for (let i = 0; i < str.length; i++) {
    let a = str.split("")[i];

    if (a == " ") {
      valu.push(val);
      val = 0;
    } else {
      val++;
    }

    console.log(i);
  }

  // Add this line to add the last value "val".
  valu.push(val);

  val = 0;

  // Search for the max value 
  for (let i = 0; i < valu.length; i++) {
    if (valu[i] > val) {
      val = valu[i];
    }
  }

  return val;
}
0 голосов
/ 25 мая 2019

Другой подход, который можно использовать для решения этой проблемы в одной строке, - это использовать Array.sort в descending order и просто выбрать первый элемент. Если вы начнете с разбиения предложения на пробел (через String.split ), вы получите массив с каждым из слов. Затем закажите их, проверив длину каждого слова:

let str = 'What if we try a super-long word such as otorhinolaryngology'

let result = str.split(' ').sort((a,b) => b.length - a.length)[0]

console.log(result) // <-- longest word
console.log(result.length) // <-- word length

Если вы хотите найти самое короткое слово, просто измените логику сортировки на a.length - b.length и т. Д.

0 голосов
/ 25 мая 2019

Вы пропустили добавление последнего слова к массиву в коде, который вы разместили.

Для той же проблемы мы можем добиться этого, используя следующий код

1) Использование For Loop

function findLongestWord(str) {
  var strSplit = str.split(' ');
  var longestWord = 0;
  for(var i = 0; i < strSplit.length; i++){
    if(strSplit[i].length > longestWord){
    longestWord = strSplit[i].length;
     }
  }
  return longestWord;
}
findLongestWord("What if we try a super-long word such as otorhinolaryngology");

2) Использование метода сортировки

function findLongestWord(str) {
  var longestWord = str.split(' ').sort(function(a, b) { return b.length - a.length; });
  return longestWord[0].length;
}
findLongestWord("What if we try a super-long word such as otorhinolaryngology");

3) Использование метода уменьшения

function findLongestWord(str) {
  var longestWord = str.split(' ').reduce(function(longest, currentWord) {
    return currentWord.length > longest.length ? currentWord : longest;
  }, "");
  return longestWord.length;
}
findLongestWord("What if we try a super-long word such as otorhinolaryngology");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...