JZ1 二维数组中的查找

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
解题思路
每一行从左到右递增的顺序排序,每一列从上到下递增的顺序排序,所以在数组里,可以往左找比它小的数,往下找比它大的数。这样可以从左上角开始找,根据target的大小来不断缩小查找的区间。
 
解决代码
public class Solution {
    /**
    从左上角开始,target比array[r][c]大的话,需要往下找,小的话往左找,直到边界
    */
    public boolean Find(int target, int [][] array) {
        if(array==null || array.length==0 ||array[0].length==0) return false;
        int rows = array.length;//数组行数
        int colums = array[0].length;//数组列数
        int r = 0;
        int c = colums-1;
        while(r<=rows-1 && c>=0 ){
            if(target>array[r][c]){
                r++;
                
            }
            else if(target<array[r][c]){
                c--;
            }
            else if(target == array[r][c]){
                return true;
           }
        }
                return false;
    }
}

 JZ2 替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 
解题思路

要插入一个字符,从前往后遍历插入需要移动很多次字符,可以考虑从后往前遍历,可以减少移动次数。
1.先遍历字符串,找到字符串的空格数
2.把stringbuffer的长度设为 原始长度+2*空格数
3.用两个下标,原始字符串的下标和新字字符串的下标:
从后往前,要是原始字符串的字符为空格,新字符串往前填%20(挨个填0,2,%,倒着来),原始字符串下标往前移1,新字符串下标往前移3
要是原始字符串下标的字符不是空格,就复制到新字符串下标的位置,两个下标都往前移1

 解决代码

public class Solution {
    public String replaceSpace(StringBuffer str) {
        if(str == null){return null;}
        int length = str.length();
        int indexOfOriginal = length-1;
        int oldLength = length;
        for(int i=0; i<str.length();i++){
            if(str.charAt(i)==' '){
                length +=2;
            }            
        }
        str.setLength(length);
        int indexOfNew = length-1;
        while(indexOfNew>indexOfOriginal){
            if(str.charAt(indexOfOriginal)==' '){
                str.setCharAt(indexOfNew--,'0');
                str.setCharAt(indexOfNew--,'2');
                str.setCharAt(indexOfNew--,'%');
                indexOfOriginal--;
            }
            else{
                str.setCharAt(indexOfNew--,str.charAt(indexOfOriginal--));                
            }
        }
            return str.toString();
        }
}

 

JZ3 从尾到头打印链表

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
 
解题思路
从尾到头,逆序输出可以考虑递归
 
解决代码
/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> al = new ArrayList<>();

        if(listNode!= null){
            al.addAll(printListFromTailToHead(listNode.next));
            al.add(listNode.val);   
        }
        return al;
        
    }
}

 JZ5 用两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
 
解题思路
入队方式和入栈方式是一样的,但是出队方式是弹出先入队的元素,出栈是弹出后入栈元素,将栈反转,这样pop出来的就是先入栈的元素了
 
解决代码
import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);//入栈队列和栈是一样的
        
    }
    
    public int pop() {
        //队列pop弹出的是队列头的元素,所以将栈逆转再pop就可以
        if(stack2.isEmpty())
        while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
        }
        int t =stack2.pop();
        return t;
    }
}