大家觉得剑指offer的题适合用java做吗?

C_reator 2014-08-24 12:03:17
今天看了一道剑指offer的算法题,就是第四道,题目是:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
它原先的想法是从头开始遍历,遇到空格就替换,这样的话后面的字符就会移动,有些字符会移动多次,算法效率较低,时间复杂度为O(n^2)
所以提出一种新的想法,就是从后面开始遍历,先算出替换之后的长度是多少,然后用一个指针A指向那个地方,另一个指针B指向原来字符数组的末尾,然后一个一个复制过去,当B遇到空格的时候,在A那里添加“%20”。
大概思路就是这样子。
但是问题就出在这里,字符数组的长度是不可变的,至少在java中是这样,所以我们要新建一个数组吗?
但是新建一个数组的话,我们只要从头开始一个一个遍历,然后遇到空格就在新数组中加入“%20”,这样时间复杂度不也是O(n)吗
那这道题不就没有意义了?
所以我想问的是 大家觉得剑指offer的题都适合用java做吗?
...全文
4433 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主,这本书怎么样?我最近也在看面试题,都被c之类的搞吐的了。
C_reator 2014-08-28
  • 打赏
  • 举报
回复
其实我的本意就是觉得剑指offer的题不适合用java做,因为好多算法题涉及到指针,而且java对很多算法都已经实现了封装,所以这就是当初我刚开始看剑指offer想用java做但是感觉怪怪的原因,谢谢大家的讨论。
beowulf2005 2014-08-27
  • 打赏
  • 举报
回复
没听说过空间复杂度吗? 在未规定空间复杂度的情况下,去要求时间复杂度,其意义不免要打折扣。 空间换时间,或是时间换空间,是程序员的基本常识,能转换到什么程度则是功力高低问题。 大神们在出算法题前,最好先上个大学。
liumoujie3 2014-08-27
  • 打赏
  • 举报
回复
看看这个类的源代码,可能对你有帮助,只是可能哈 java.net.URLEncoder.encode
于金龙 2014-08-27
  • 打赏
  • 举报
回复
你搞错了!Java中String是不变的,所以你每次替换一个空格,都是实际上新建了一个字符串,并丢弃原来的字符串,而不是一定字符的问题了!!!其实始不用这样的,Java中有可变长度字符串StringBuffer、StringBuilder 你实际只需要把字符串读一遍,然后根据每个char的值等不等于'='来判断给可变长度字符串中添加什么内容
public class Test {
	
	public static void main(String[] args) throws Exception {
		 String s = "We Are Happy";
		 System.out.println(replaceMethod(s));
	}
	
	private static String replaceMethod(String s) {
		StringBuffer buffer=new StringBuffer();
		if(s!=null){
			for(int i=0;i<s.length();i++){
				char ch=s.charAt(i);
				if(ch==' '){
					buffer.append("%20");
				}else{
					buffer.append(ch);
				}
			}
		}
		return buffer.toString();
	}
	
}
woshikaka6 2014-08-26
  • 打赏
  • 举报
回复
String str ="We Are Happy"; System.out.println(str.replaceAll(" ","%20")); 用java写不就是两行代码吗?没明白楼主要表达什么意思?
乔不思 2014-08-25
  • 打赏
  • 举报
回复
这个题只是针对算法,没有针对 特定的语言,,,
kosora曹 2014-08-25
  • 打赏
  • 举报
回复
编程之美、剑指offer等等,都不适合用Java做,建议用C/C++。 因为你的对手都是对指针了如指掌的大神;如果你用C/C++写,可能写的不会完全对,但面试官会看你的思路、设计思想,代表你还有翻盘的机会。 但如果用Java、python、JavaScript等等语言来处理指针的话,明摆着是将Offer拱手相让!
kosora曹 2014-08-25
  • 打赏
  • 举报
回复
引用 2 楼 Android_iPhone 的回复:

public class ReplaceMethodTest {

    public static void main(final String[] args) {
        String string = "We Are Happy";
        System.out.println(replaceMethod(string));
    }

    public static String replaceMethod(final String inputString) {
        return inputString.replace(" ", "%20");
    }
}
We%20Are%20Happy
是说用Java如何实现replace方法吗?还是仅仅如何使用replace方法?
面试题是绝对不允许直接调用replace、sort、reverse之类的方法的,因为面试官是考的算法,并不是考你对api的熟悉程度。
qzw1210 2014-08-25
  • 打赏
  • 举报
回复

public static void main(final String[] args) {
        String string = "We Are Happy";
        System.out.println(replaceString(string));
    }
 
    public static String replaceString(final String inputString) {
        return inputString.replace(" ", "%20");
    }
日知己所无 2014-08-24
  • 打赏
  • 举报
回复

public class ReplaceMethodTest {

    public static void main(final String[] args) {
        String string = "We Are Happy";
        System.out.println(replaceMethod(string));
    }

    public static String replaceMethod(final String inputString) {
        return inputString.replace(" ", "%20");
    }
}
We%20Are%20Happy
是说用Java如何实现replace方法吗?还是仅仅如何使用replace方法?
vnvlyp 2014-08-24
  • 打赏
  • 举报
回复
字符数组的长度难道在其他语言是可变的?如果是那就不是数组了,而是封装了自动扩容的数组类或列表等。 就算在C中这种方法也要首先扩展原字符数组,而且有一条原则是最好不要修改传给函数的参数,那么一般还是会重新创建一个数组再进行操作。 所以重新创建一个数组没问题啊。。 没看过这个剑指offer不清楚这题它所谓的精髓在哪。。但是你那样确实还是O(n)。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧