回答
效率明智的最有效的方法是不使用递归。
迭代方法(遍历字符串并打印字符)是线性的,O(N),其中N是字符串的长度。
由于您询问递归解决方案,但它是二次的,O(N^2)表示时间复杂度,因为打印N个字符,每个函数调用都生成N个子字符串。 (每次将N-1个字符复制到内存中)。
public void printBackwards(String s) {
if (!s.isEmpty()) {
int endPos = s.length() - 1;
System.out.print(s.charAt(endPos));
printBackwards(s.substring(0, endPos));
}
}
你打我吧> :-( :) – HyperNeutrino
@AlexL 。我喜欢你的破坏者警报代码,虽然:) –
我不是downvoter,但这有'O(N^2)'时间复杂性,因为'substring'必须复制字符。在“改进”String的实现之前,它将是线性的。 –
既然你想递归,我会给你一个提示(因为这是在类问题):
打印的最后一个字符第一。你将如何递归打印它?现在只是倒退!
悬停揭示代码:)
公共无效printBackwards(一个String){
如果(s.length()== 0)返回;
是System.out.print(s.charAt(s.length() - 1);
printBackwards(s.substring(0,s.length() - 1);
}
需要一个基本案例... –
@ cricket_007好的赶上!我会解决这个问题... – HyperNeutrino
最有效的方式使用递归是这样的:
static void printBackwards(String s)
{
printBackwards(s, 0, s.length());
System.out.println();
}
static void printBackwards(String s, int start, int end)
{
if ((end-start)<2)
{
if (end>start)
{
System.out.print(s.charAt(start));
}
return;
}
int mid = start + (end-start)/2;
printBackwards(s, mid, end);
printBackwards(s, start, mid);
}
这是比其他答案更为有效,因为它不分配一大堆新的字符串和只使用O(日志N)的堆栈.. 。
但是,你真的不需要递归来向后打印一个字符串。
注意:如果这是家庭作业,你的手在此,您将教授可能知道,你没有写吧:)
- 1. C向后递归打印
- 2. 向后打印字符串
- 3. 递归方法打印字符串中的每个字母3次向后
- 4. 为了转换一个递归结果字符串打印向后
- 5. C++如何向后打印字符串?
- 6. 向后打印字符串的循环
- 7. 打印字符串反向
- 8. 打印字符串先后
- 9. 这个递归线如何实现打印字符串反转?
- 10. php递归函数打印字符串3次不起作用
- 11. 在Java中垂直使用递归打印字符串
- 12. 字符串值而不是在递归过程中打印
- 13. C#打印字符串数组的所有子集与递归
- 14. 打印原始字符串以及递归
- 15. 通过递归打印字符串的一部分
- 16. 为什么我要在递归DFS后打印特殊字符?
- 17. 递归反向字符串链表
- 18. 反向使用递归的字符串
- 19. Java递归反向字符串
- 20. 反向字符串递归方法
- 21. C++反向字符串递归
- 22. 打印树递归
- 23. 用递归打印“*”
- 24. 打印递归树
- 25. 递归 - 打印数
- 26. 递归打印C++
- 27. 为什么打印反向字符串?
- 28. 打印内容的字符串向量
- 29. C++打印一个反向字符串
- 30. 装配MIPS:反向打印字符串
你问如何实现或纯粹效率? –
如果通过'高效'来表示原始表现,那么这个问题将无法回答。 Java是一种语言规范;反转字符串的最有效方法将取决于该规范的实施情况,您正在操作的平台以及许多其他因素。幸运的是,在99.99%的情况下,您可以忽略所有这些,并使用最优雅的解决方案而不是最高效的解决方案。 – sprinter
答案应该是Big-O符号吗? –