替换空格
问题描述
请实现一个函数,把字符串 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()方法的用法:
- substring(int beginIndex) 形式
此方式用于提取从索引位置开始至结尾处的字符串部分。调用时,括号中是需要提取字符串的开始位置,方法的返回值是提取的字符串。
- 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)