我在以下练习中遇到了麻烦:
我应该反转列表中除第一个元素之外的所有元素,列表的第一个元素必须保持原来的位置。
更正示例:
input: rvrsTail [1,2,3,4,5]
output [1,5,4,3,2]
到目前为止我做了什么:
rvrsTail :: [x] -> [x]
rvrsTail xs = reverse ( tail xs)
这确实反转了列表的尾部但删除了第一个元素,因为我无法将第一个元素存储在变量中,所以我似乎无法理解如何解决这个问题。
输出错误:
input: rvrsTail [1,2,3,4,5]
output [5,4,3,2]
由于这应该是一个初学者的练习,解决方案应该很简单。
答案 0 :(得分:5)
当您收到非空列表时,您必须将头部留在原位并将尾部反转。换句话说,您可以将列表解构为头部和尾部,然后使用该头部和反向尾部重建列表:
BufferedReader br = ...;
TimeLimiter timeLimiter = new SimpleTimeLimiter();
try {
String line = timeLimiter.callWithTimeout(br::readLine, 10, TimeUnit.SECONDS);
} catch (TimeoutException | UncheckedTimeoutException e) {
// timed out
} catch (Exception e) {
// something bad happened while reading the line
}
答案 1 :(得分:4)
你快到了。为确保列表的第一个元素保持原样,只需使用模式匹配并删除tail
调用:
rvrsTail :: [x] -> [x]
rvrsTail (x:xs) = x:(reverse xs)
现在,请注意上面的函数在尝试使用空列表时会抛出异常。你应该处理那个案子。