剑指offer做题记录JZ2-JZ4

JZ2.请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路一:
重新创建一个三倍字符串大小的字符数组,用charAt()方法提取字符作比较,如果不为空格,加入字符数组,如果为空格,则替换为"%20"

import java.util.*;
public class Solution {
    public String replaceSpace (String s) {
        // write code here
        int length=s.length();
        char a[]=new char[length*3];
        int index=0;
        for(int i=0;i<length;i++){
            //提取指定字符
            if(s.charAt(i)==' '){
                a[index++]='%';
                a[index++]='2';
                a[index++]='0';
            }else{
                a[index++]=s.charAt(i);
            }
        }
        //将字符数组转为string类型,第一个参数是开始的位置,第二个参数是数量
        return new String(a,0,index);
    }
}

解题思路二:
用split()方法分隔字符串,返回一个字符数组,除最后一个字符数组之外,每个字符数组之后都应该加上一个"%20",因为该题字符串末尾的空格也要求转换为"%20",所以在字符串后面加上一个" end",再用split(" “)分割(连续两个空格保留一个空格),去掉最后一个字符数组,剩下的字符数组除倒数第二个字符数组之外,每个字符数组后都应该加上一个”%20"。

import java.util.*;
public class Solution {
    public String replaceSpace (String s) {
        // write code here
        StringBuilder res=new StringBuilder();
        String b=s+" end";
        String[] array=b.split(" ");
        for(int i=0;i<array.length-1;i++){
            res.append(array[i]);
            if(i!=array.length-2){
                res.append("%20");
            }
        }
        return String.valueOf(res);
    }
}

JZ3.输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

class ListNode{
	int val;
	ListNode next;
	ListNode(int val){
		this.val=val;
	}
}

解题思路一:
用非递归的方法,按链表从尾到头输出,体现了先进后出,用ArrayList的add(index,value)方法,把所有值插入到同一个同一个指定位置。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode){
        ArrayList<Integer> al=new ArrayList<>();
        while(listNode!=null){
            al.add(0,listNode.val);
            listNode=listNode.next;
        }
        return al;
    }
}

解题思路二:
使用递归的方法

import java.util.ArrayList;
public class Solution {
    ArrayList<Integer> al=new ArrayList<>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode){
        if(listNode!=null){
            printListFromTailToHead(listNode.next);
            al.add(listNode.val);
        }
        return al;
    }
}

JZ4.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
1.前序序列的第一个数字为根结点
2.根据中序序列确定左右子列,根结点前为左子列,根结点后为右子列
3.再对左右子列使用递归,重复第一二步骤

import java.util.Arrays;
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length==0||in.length==0){
            return null;
        }
        //确定根结点
        TreeNode root=new TreeNode(pre[0]);
        for(int i=0;i<in.length;i++){
            if(in[i]==pre[0]){
                //copyOfRange包含第一个参数,不包含第二个参数
                root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
                root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
                break;
            }
        }
        return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值