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

题目

请实现一个函数,把字符串中的每个空格替换成“%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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值