Codewars挑战 - 最长的元音子串

时间:2017-11-22 11:03:20

标签: javascript algorithm

是的,我正在经历一场代码战争挑战,其目的是返回最长元音子串的长度,因为“codewarriors”将是“io”所以答案将是2.我解决的方式它是通过用空格替换非元音,将剩下的元音分成一个数组,然后在这个数组上循环并将第一个子串推入另一个数组,然后我设置另一个for循环,这样我就可以循环遍历第一个数组检查第二个数组的长度,如果需要,用最长的数组替换。

这是我遇到麻烦的地方,因为我正在推送第一个值(与其他值进行比较的那个),但是如果在第二个循环中它需要被替换我只是替换不推送的值,所以如果第一个值是数组作为对象的最长值,如果需要在第二个循环中替换它将被替换但它将转换为字符串,这意味着给出长度的结束return语句需要更改介于最长和最长之间最长[0] .length,我通过在最后添加条件检查typeof来绕过它,但是我想知道是否还有另一种方法呢?

我是初学者,如果以上内容有点令人困惑,请原谅我,并且非常欢迎任何有关解决挑战的其他方法的提示。

这是不起作用的代码 -

  function longestVowel(str) {

  var seperateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' ');

  var split = seperateVowels.split(" ");

  var longest = [];
  for(var i = 0; i < split.length; i++) {
    if(longest.length === 0 && split[i] != "") {
      longest = split[i];
    }  for(var j = 0; j < longest.length; j++) {
      if(split[i].length > longest[j].length) {
        longest = split[i];
      }
     }
    }

  return longest.length;

}

这是我的工作 -

function longestVowel(str) {

  var seperateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' ');

  var split = seperateVowels.split(" ");

  var longest = [];
  for(var i = 0; i < split.length; i++) {
    if(longest.length === 0 && split[i] != "") {
      longest.push(split[i]);
    }  for(var j = 0; j < longest.length; j++) {
      if(split[i].length > longest[j].length) {
        longest = split[i];
      }
     }
    }

  if(typeof longest == "object") {
    return longest[0].length;
  } else {
    return longest.length;
  }

}

longestVowel("suoidea");

2 个答案:

答案 0 :(得分:1)

我喜欢你首先过滤掉非元音然后将它分成数组的方法。

编辑:根据评论中的建议修改了答案:

function longestVowel(str) {
  let separateVowels = str.replace(/[^aeiou]/ig, ' ').split(' ');
  let longest;

  separateVowels.forEach(function(vowelGroup) {
    longest = vowelGroup.length > longest.length
      ? vowelGroup
      : longest;
  });

  return longest;
}

console.log(longestVowel('suoidea')); // uoi

JavaScript 1.8/EcmaScript5

function longestVowel(str) {
  let separateVowels = str.replace(/[^aeiou]/ig, ' ').split(' ');
  let longest = separateVowels.reduce(function(a, b) {
    return a.length > b.length ? a : b;
  });

  return longest;
}

原始回答: 我从那里解决这个问题的方法是按长度对数组进行排序,然后得到第一个(因此也是最长的)项目:

function longestVowel(str) {
  let separateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' ').split(' ');
  let longest = separateVowels.sort(function (a, b) {
    return b.length - a.length;
  })[0];

  return longest;
}

console.log(longestVowel('suoidea')); // uoi

答案 1 :(得分:1)

这里的线性算法value1_2016背后的想法是你真的必须只查看一次数组的每个元素。

在迭代的每个步骤中,我们保持两个变量Public Sub Consolidate_to_master() Dim wksMaster As Worksheet Dim wks As Worksheet Dim rng As Range Dim i As Integer Dim wkb As Workbook Dim Filename As String Dim Path As String Dim Wb1 As Workbook, wb2 As Workbook Path = "\\ttsnas02\user_mdocs$\tdf8273\Documents\Rob\External supplier timesheet\CSV Supplier Main\Inbox folder\" 'CHANGE PATH Filename = Dir(Path & "*.xl??") ' bind the master worksheet to access it later on ' change index if needed Set wksMaster = ActiveWorkbook.Worksheets(1) ' or ThisWorkbook i = 3 Do While Len(Filename) > 0 'IF NEXT FILE EXISTS THEN Set wkb = Workbooks.Open(Path & Filename) ' loop through range in worksheet with index 1 (the first) ' change index if needed With wkb.Worksheets(1) For Each rng In .Range("L12:L23") ' if there is a value in the cell If rng <> vbNullString Then Range(Selection, Cells(Rows.Count, Selection.Column).End(xlUp)).Select wksMaster.Range("A" & i) = .Range("J8") wksMaster.Range("B" & i) = "1234" wksMaster.Range("C" & i) = .Range("J9") wksMaster.Range("D" & i) = "10" wksMaster.Range("E" & i) = rng wksMaster.Range("F" & i) = "" wksMaster.Range("G" & i) = "" wksMaster.Range("H" & i) = "" wksMaster.Range("I" & i) = "" wksMaster.Range("J" & i) = "" wksMaster.Range("K" & i) = "" wksMaster.Range("L" & i) = "" wksMaster.Range("M" & i) = "" ' increment i i = i + 1 End If Next End With wkb.Close True Filename = Dir Loop End Sub O(n),它们包含目前最长的元音子串和当前正在考虑的最长的元音子串。

当遇到元音时,我们会从那里开始检查,直到遇到非元音字符为止。直到它不再是元音子串的点。这将是我们与globalMax进行比较的currentMax,以检查我们是否遇到了更长的元音子字符串。因此,currentMax是所有globalMax中最好的

假设输入是'suoideaoi'

globalMax

这里'我们计算形式currentMax,因为它们是元音,但在 i | s[i] | currentMax | globalMax -------|--------|-------------|----------- 0 | s | 0 | 0 1 | u | 0 | 0 2 | o | 1 | 1 3 | i | 2 | 2 4 | d | 0 | 2 5 | e | 1 | 2 6 | a | 2 | 2 7 | o | 3 | 3 8 | i | 4 | 4 我们注意到子串不再是元音子串,所以我们停在那里并将i = 2 to 3重置为0 。

这是i = 3的原因是,一旦我们检查了元音子串currentMax ie)O(n),我们可以确定这个元音子串不需要在任何一个中进一步考虑之后可能会出现的元音子字符串,因为在此之后存在非元音字符,从而使得任何子字符串都包含此子字符串而不是元音子字符串。