替换空格&&反转字符串中的单词(LeetCode 剑指offer05 && 151)

题目

剑指 Offer 05. 替换空格 

思路

遍历,使用新的字符串来接原字符串,如为空格,则加入%20,否则加入原字符串。 

不过看了题解有另一种解法,由于空格转化为%20,设计到原字符存储空间的增加,因此先计算出需要增加的空间后。再使用双指针,从后往前遍历,这里画的动画比较好理解:

代码随想录

代码

public String replaceSpace(String s) {
//        String temp = "%20";
        StringBuilder s_new = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char temp = s.charAt(i);
            if(temp - ' ' == 0){//判断当前字符是否为空格
                s_new.append("%20");
            }
            else {
                s_new.append(temp);
            }
        }
        return s_new.toString();

    }
    public String replaceSpace_1(String s) {
        // 使用双指针 不使用额外的空间
        // 首先扩展原字符串的空间 一个空格就需要多2个位置
        int count = 0;
        // 用来存储扩展的空格
        StringBuilder s_append = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char temp = s.charAt(i);
            if(temp == ' '){//判断当前字符是否为空格 为空格则往s_append中加入两个空字符
                s_append.append("  ");
            }
        }
        // 左指针指向原字符串中最后一个字符
        int l = s.length()-1;
        // 将两个空间链接到一起
        s += s_append.toString();
        // 右指针指向新字符的最后一个位置
        int r = s.length()-1;
        // 将字符串改为char数组 方便使用下标对字符串内容进行修改
        char[] s_array = s.toCharArray();
        // 进入循环 退出条件为左指针遍历完左边所有字符
        while (l >= 0){
            // l指针所在位置为空格
            if(s_array[l] == ' '){
                s_array[r--] = '0';
                s_array[r--] = '2';
                s_array[r] = '%';
            }
            else {
                s_array[r] = s_array[l];
            }
            r --;
            l --;
        }
        return new String(s_array);
//        return s_array.toString();

    }

题目

151. 反转字符串中的单词 

思路

对字符串按空格进行分割,逆序遍历得到的字符串数组,将不为空格的(由于存在连续空格,按空格分割会保留一个空格)字符串添加到新字符串中,添加完一个字符串就加入一个空格,最后跳出循环后删掉最后一个空格即可。

代码 

public String reverseWords(String s) {
        String[] s_subs = s.split(" ");
        StringBuilder s_new = new StringBuilder();
        for (int i = s_subs.length - 1; i >= 0; i--) {
//            System.out.println(s_subs[i]);
            if(!s_subs[i].isEmpty()) {
                System.out.println(s_subs[i]);
                s_new.append(s_subs[i]);
                s_new.append(" ");
            }
        }
        // 删掉最后一个空格
        s_new.deleteCharAt(s_new.length() -1);
        return s_new.toString();

    }

猜你喜欢

转载自blog.csdn.net/wangyumei0916/article/details/131712080
今日推荐