Java 整数n作为List的第二个参数传递<;字符串>;。子列表(fromIndex,toIndex),但是stacktrace说toIndex是n+;科特林2号
我正在解决Codewars中的一个问题: 输入是一个字符串数组和一个整数k,输出是最长的字符串,可以通过从数组中连续提取k个元素并将它们连接到字符串来形成。 下面是我针对这个问题的代码,我现在正在测试它Java 整数n作为List的第二个参数传递<;字符串>;。子列表(fromIndex,toIndex),但是stacktrace说toIndex是n+;科特林2号,java,recursion,kotlin,Java,Recursion,Kotlin,我正在解决Codewars中的一个问题: 输入是一个字符串数组和一个整数k,输出是最长的字符串,可以通过从数组中连续提取k个元素并将它们连接到字符串来形成。 下面是我针对这个问题的代码,我现在正在测试它 fun main() { val array = arrayOf("1", "2", "3", "4", "5", "6", "7") p
fun main() {
val array = arrayOf("1", "2", "3", "4", "5", "6", "7")
println(longestConsec(array, 2))
// Combinations below don't work either
// val array = arrayOf("1", "2", "3", "4","5", "6", "7", "8", "9")
// println(longestConsec(array, 3))
//
// val array = arrayOf("1", "2", "3", "4","5", "6", "7", "8", "9", "10", "11")
// println(longestConsec(array, 4))
// val array = arrayOf("1", "2", "3", "4","5", "6", "7", "8", "9", "10", "11", "12", "13")
// println(longestConsec(array, 5))
}
fun longestConsec(strings: Array<String>, size: Int) =
when {
strings.isEmpty() || size > strings.size || size <= 0 -> ""
else -> ConsecutiveString(strings.toList(), size)
.searchLongestConsecutiveString(0, mutableListOf())
.maxBy { it.length } ?: throw IllegalArgumentException()
}
class ConsecutiveString(private val originalList: List<String>, private val size: Int) {
tailrec fun searchLongestConsecutiveString(index: Int, acc: MutableList<String>): List<String> {
println("start")
return when {
index + size >= originalList.size -> acc
else -> {
println(index + size)
// *** doesn't work ***
searchLongestConsecutiveString(
index + 1
, acc.apply { add(originalList.subList(index, index + size).joinToString("")) }
)
// *** doesn't work ***
// *** works ***
// val consecutiveString = originalList.subList(index, index + size).joinToString("")
// searchLongestConsecutiveString(
// index + 1
// , acc.apply { add(consecutiveString) }
// )
// *** works ***
}
}
}
}
fun main(){
val数组=数组(“1”、“2”、“3”、“4”、“5”、“6”、“7”)
println(longestcense(数组,2))
//下面的组合也不起作用
//val数组=数组(“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”)
//println(longestcense(数组,3))
//
//val数组=数组的数组(“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”)
//println(longestcense(数组,4))
//val数组=数组的数组(“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”、“12”、“13”)
//println(longestcense(数组,5))
}
有趣的长字符串(字符串:数组,大小:Int)=
什么时候{
strings.isEmpty()| | size>strings.size | | size“”
else->ConcertiveString(strings.toList(),size)
.SearchLongestContinuousInvesting(0,mutableListOf())
.maxBy{it.length}?:抛出IllegalArgumentException()
}
类连续性(私有值原始列表:列表,私有值大小:Int){
tailrec fun SearchLongestContinuousInvestring(索引:Int,附件:可变列表):列表{
println(“开始”)
何时返回{
索引+大小>=原始列表大小->附件
其他->{
println(索引+大小)
//***不起作用***
搜索最长的连续搜索(
索引+1
,acc.apply{add(originalList.subList(index,index+size).joinToString(“”))中的
)
//***不起作用***
//***作品***
//val consutivestring=原始列表。子列表(索引,索引+大小)。joinToString(“”)
//搜索最长的连续搜索(
//索引+1
//,acc.apply{添加(连续投资)}
// )
//***作品***
}
}
}
}
这段代码抛出java.lang.IndexOutOfBoundsException,下面是stacktrace
开始
二,
开始
三,
开始
四,
开始
五,
开始
六,
线程“main”java.lang.IndexOutOfBoundsException中的异常:toIndex=8
位于java.util.ArrayList.subListRangeCheck(ArrayList.java:1010)
在java.util.ArrayList.subList(ArrayList.java:1002)中
搜索最长的连续搜索(CodeWars.kt:37)
Longestcense的CodeWarsKt(CodeWars.kt:22)
在CodeWarsKt.main(CodeWars.kt:4)
在CodeWarsKt.main(CodeWars.kt)
进程已完成,退出代码为1
这里有三件有趣的事情
IntelliJ Kotlin插件:1.3.50-release-IJ2019.2-1您调用的
size
内部acc.apply
。在该范围内,size
指的是acc
的大小,而不是连续投资::size
避免使用
apply
或使用标签:
this@ConsecutiveString.size
或者,我应该更改名称以避免这种混淆。非常感谢你!