1. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成”%20”。
示例 1:
输入:s = “We are happy.”
输出:”We%20are%20happy.”
限制:
0 <= s 的长度 <= 10000
思路:
- 获取数组长度,遍历数组中的字符
以一个char数组作为容器装载新的数据,并设计一个指针作为索引
- 如果字符为空格,那么以size++作为索引进行三次添加,‘%’,‘2’,‘0’
- 如果不为空格,那么以size++作为做索引进行添加当前字符串索引的字符
- size的目的,一方面作为char数组长度,一方面进行添加操作(由于是size++,先以size索引执行操作,后再进行自增)
class Solution {public String replaceSpace(String s) {// 字符串长度int length = s.length();// char类型数组作为容器// 初始化长度为3,表示极端情况下, 字符串里面全为空格,则需要所有三倍于字符串长度的字符数组"%20"为三个字符char[] chs = new char[length*3];int size = 0;for(int i=0;i<length;i++){char c = s.charAt(i);if(c==' '){chs[size++] = '%';chs[size++] = '2';chs[size++] = '0';}else{chs[size++] = c;}}String newStr = new String(chs,0,size);return newStr;}}
复杂度分析:
时间复杂度:O(n)。遍历字符串
s一遍。- 空间复杂度:O(n)。额外创建字符数组,长度为
s的长度的 3 倍。
2. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
思路:
- 问题实质:实现倒序,或者说是排序反转。
- 最好的解决方式:
- 使用栈,栈的最大特性:先进后出
步骤:
- 遍历节点,获取val,push入栈中
- 遍历节点,使用int[]进行装载pop出来的数据
class Solution {// 使用栈 (先进后出的原则,实现倒叙)public int[] reversePrint(ListNode head) {Stack<ListNode> stack = new Stack<>();ListNode temp = head;while(temp!=null){stack.push(temp);temp = temp.next;}int size = stack.size();int[] answer = new int[size];for(int i=0;i<size;i++){answer[i] = stack.pop().val;}return answer;}}
复杂度分析:
时间复杂度:O(n)。正向遍历一遍链表,然后从栈弹出全部节点,等于又反向遍历一遍链表。
- 空间复杂度:O(n)。额外使用一个栈存储链表中的每个节点。
