剑指offer面试题4(java实现)

来源:互联网 发布:树莓派能做什么 知乎 编辑:程序博客网 时间:2024/06/06 00:37

题目

请实现一个函数,把字符串中的每个空格替换成“%20”例如输入“We are happy.”则输出“We%20are&20happy.”

说明

要实现这个函数,对于java来说非常容易。java JDK中集成的String类可以对字符串进行多种操作,例如长度的获取、字符串的截取、字符串的替换等方法。而此题目要求的把字符串中的每个空格替换成“%20”就可以通过String类实现,没有时间复杂度的考虑。

String类的使用

public String replaceBlank(String string){        if(string==null||string.length()<=0){            return null;        }        String ss = string.replaceAll(" ", "%20");        return ss;    }

Java数组的实现

采用String类实现显然体现不了算法的高效,而使用字符数组来模拟字符串时,发现java中的数组是有长度的,而不同于c语言这种不定长度存储的语言,使用结束符来动态改变数组的大小,显然可以通过控制结束符的位置来定数组的大小,进而使用算法节省内存。而java数组只能通过空间换取时间来实现,而算法的优越性体现不出来(这里主要的算法思想是从后向前复制,避免了从前向后复制带来的移动开销)先看一下代码

public static char[] replaceBlank(char[] string) {        if (string == null || string.length <= 0) {            return null;        }        int orginalLength = string.length;        int blankCount = 0;        for (int i = 0; i < orginalLength; i++) {            if (string[i] == ' ') {                blankCount++;            }        }        int newLength = orginalLength + blankCount * 2;        char[] newString = new char[newLength];        // 从前向后复制        int i = 0;        int j = 0;        while (i < orginalLength && j < newLength) {            if (string[i] == ' ') {                newString[j++] = '%';                newString[j++] = '2';                newString[j++] = '0';            } else {                newString[j++] = string[i];            }            i++;        }        //从后往前复制        /*        int i = orginalLength;        int j = newLength;        while (i >= 0 && j > i) {            if (string[i] == ' ') {                newString[j--] = '%';                newString[j--] = '2';                newString[j--] = '0';            } else {                newString[j--] = string[i];            }            i--;        }*/        return newString;    }

少年不知愁滋味,为赋新词强说愁。没有必要为了C语言中的不定数组,在java中实现一种类似的算法,理解算法万岁。

0 0