剑指 Offer 05. 替换空格
题目描述
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制:
0 <= s 的长度 <= 10000
解题思路
双指针方法
1、首先将空格数量计算出来,将其转化成字符数组
2、根据需要替换的空格数量创建新的字符数组
3、利用双指针,头指针指向原有字符数组的末尾,尾指针指向替换后的字符数组的末尾。。接下来向前移动头指针,逐个把它指向的字符复制到尾指针指向的位置,直到碰到第一个空格为止。接着向前复制,直到碰到第二、三或第n个空格。
代码实现
class Solution {
public String replaceSpace(String s) {
if(s.equals("")){
return s;
}
char[] strArray = s.toCharArray();
int lengthSpace = 0;
for(int i=0;i<strArray.length;i++){
if(strArray[i] == ' '){
lengthSpace++;
}
}
int newStrLength = strArray.length+lengthSpace*2;
char[] newStr = new char[newStrLength];
int j = newStrLength-1;
int i = strArray.length-1;
while(i>=0){
if(strArray[i] != ' '){
newStr[j--] = strArray[i--];
}else{
newStr[j--]='0';
newStr[j--]='2';
newStr[j--]='%';
i--;
}
}
return new String(newStr);
}
}
剑指 Offer 06. 从尾到头打印链表
题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
解题思路
方式一:首先思路肯定是从遍历链表开始,并且依据题目意思就是,遍历的最后一个结点是最先输出,遍历的第一个结点最后输出,可以看出这是“先进先出模型”,因此采用栈来实现这种顺序。
方式二:递归的方式
代码实现
public static int[] reversePrint(ListNode head) {
ListNode node = head;
int count = 0;
while (node != null) {
++count;
node = node.next;
}
int[] nums = new int[count];
node = head;
for (int i = count - 1; i >= 0; --i) {
nums[i] = node.val;
node = node.next;
}
return nums;
}
//栈的方式
class Solution {
public int[] reversePrint(ListNode head) {
Stack<Integer> stack = new Stack<Integer>();
while(head != null){
stack.push(head.val);
head = head.next;
}
int[] arr = new int[stack.size()];
for(int i=0;!stack.isEmpty();i++){
arr[i] = stack.pop();
}
return arr;
}
}