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; } }