题目描述——替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy。则经过替换之后的字符串为We%20Are%20Happy。
public class Solution {
public String replaceSpace(StringBuffer str) {
int length=str.length();
int num=0;
//先计算空格数
for(int i=0;i<length;i++)
{
if(str.charAt(i)==' ')
num++;
}
//计算替换之后的字符串的长度
int newlength=length+num*2;
int indexold=length-1;
int indexnew=newlength-1;
str.setLength(newlength);//扩大长度,防止越界
for(;indexold>=0 && indexold<indexnew;indexold--)
{
if(str.charAt(indexold)==' ')
{
str.setCharAt(indexnew--,'0');
str.setCharAt(indexnew--,'2');
str.setCharAt(indexnew--,'%');
}
else
{
str.setCharAt(indexnew--,str.charAt(indexold));
}
}
return str.toString();
}
}测试用例
- 输入的字符串中包含空格(空格位于最前面;空格位于最后面;空格位于中间;字符串中有连续多个空格)。
- 输入的字符串中没有空格。
- 特殊输入测试(字符串为空;字符串只有一个空格;字符串是连续多个空格)。
题目描述——从尾到头打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
示例1
输入:{67,0,24,58}
返回值:[58,24,0,67]
方法1:使用递归。实现简单,但当链表非常长时,会导致函数调用层级很深,从而导致函数调用栈溢出。
方法2:利用栈的特性(先进后出)。相比较递归,用栈基于循环实现的代码鲁棒性更好。
/**
* public class ListNode {
* int val;
* ListNode next = null;
* ListNode(int val) {
* this.val = val;
* }
* }
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> s=new Stack<>();
while(listNode!=null)
{
s.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> a=new ArrayList<>();
while(!s.isEmpty())
{
a.add(s.pop());
}
return a;
}
}测试用例
功能测试(输入的链表有多个节点;输入的链表只有一个结点)。
特殊输入测试(空链表)。
题目描述——用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
//入队列全由Stack1实现
public void push(int node) {
stack1.push(node);
}
//出队列时由Stack2实现
public int pop() {
if(stack2.isEmpty())
{
while(!stack1.empty())
{
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}测试用例
- 往空队列里添加、删除元素。
- 往非空队列里添加、删除元素。
- 连续删除元素直至队列为空。
题目描述——重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
示例1
输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:{1,2,5,3,4,6,7}
/*
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
*/
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length<=0)
return null;
if(pre.length==1)
return new TreeNode(pre[0]);
int rootval=pre[0];
TreeNode root=new TreeNode(rootval);
int rootindex=0;
for(int i=0;i<in.length;i++)
{
if(in[i]==rootval)
{
rootindex=i;
break;
}
}
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootindex+1),Arrays.copyOfRange(in,0,rootindex));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootindex+1,pre.length),Arrays.copyOfRange(in,rootindex+1,in.length));
return root;
}
}测试用例
- 普通二叉树(完全二叉树;不完全二叉树)。
- 特殊二叉树(所有节点都没有右子节点的二叉树;所有节点都没有左子节点的二叉树;只有一个节点的二叉树)。
- 特殊输入测试(空二叉树;输入的前序遍历序列和中序遍历序列不匹配)。


京公网安备 11010502036488号