【54】替换空格 | 从尾到头打印链表

替换空格

问题描述

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

解题思路

遍历字符串,若发现空格则令新的字符串等于空格前的一段 + “%20” + 空格后的一段。

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        for(int i=0; i<s.length(); i++){
    
    
            if(s.charAt(i) == ' '){
    
    
                s = s.substring(0,i) + "%20" + s.substring(i+1);
                i+=2; //注意因 %20 而导致的序号增大
            }
        }
        return s;
    }
}

时间复杂度:O(n2) substring()方法的时间复杂度是O(n)
空间复杂度:O(1)

一种空间换时间的方法:

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        String res = "";
        int n =s.length();
        for(int i=0; i<n; i++){
    
    
            char c = s.charAt(i);
            switch(c){
    
    
                case ' ' :
                    res += "%20";
                    break;
                default:
                    res += c;
                    break;
            }
        }
        return res;
    }
}

时间复杂度:O(n)
空间复杂度:O(n + 2k)(n为原字符串长度,k为空格的个数)

题解提供了双指针的思路,先统计出空格的个数,再提前在字符串s中新增所需的空间,然后一个指针指向新字符串的最后一个位置,另外一个指针指向原字符串的最后一个元素,若元素为空格则填充“%20”,否则令俩指针所指元素相等。当俩指针指向同一位置时,跳出循环。

小总结

substring()方法的用法:

  1. substring(int beginIndex) 形式
    此方式用于提取从索引位置开始至结尾处的字符串部分。调用时,括号中是需要提取字符串的开始位置,方法的返回值是提取的字符串。
  1. substring(int beginIndex,int endIndex) 形式
    此方法中的 beginIndex 表示截取的起始索引,截取的字符串中包括起始索引对应的字符;endIndex 表示结束索引,截取的字符串中不包括结束索引对应的字符。该方法用于提取位置 beginIndex 和位置 endIndex 位置之间的字符串部分

注意:

对于开始位置 beginIndex, Java 是基于字符串的首字符索引为 0 处理的,但是对于结束位置 endIndex,Java 是基于字符串的首字符索引为 1 来处理的。

从尾到头打印链表

问题描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

解题思路

先求出链表的长度,为存储结果的数组申请合适的内存大小,再次遍历链表,并将其值从后往前存储在数组中。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public int[] reversePrint(ListNode head) {
    
    
        int n = getListLength(head);
        int res[] = new int[n];
        for(int i=n-1;i>=0;i--){
    
    
            res[i] = head.val;
            head = head.next;
        }
        return res;
    }

    public int getListLength(ListNode head){
    
    
        int n = 0;
        while(head != null){
    
    
            n++;
            head = head.next;
        }
        return n;
    }
}

时间复杂度:O(n)
空间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/qq_43424037/article/details/114871878
今日推荐