是的,我正在经历一场代码战争挑战,其目的是返回最长元音子串的长度,因为“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");
答案 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
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)
,我们可以确定这个元音子串不需要在任何一个中进一步考虑之后可能会出现的元音子字符串,因为在此之后存在非元音字符,从而使得任何子字符串都包含此子字符串而不是元音子字符串。