一、二维数组的查找
1、题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
2、题目分析
拿到题目的第一眼会自然从左上角开始遍历数组,但是当所选数字大于当前位置数字时,会产生向下和向右两条路径,当然暴力遍历其实也是能通过的。但观察数组规律可以发现,若从左下角(或右上角)开始遍历时,如果大于就向右,如果小于就向上,当采用此种方式时最优。
3、具体实现
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
int i=rows-1,j=0;
while(i>=0 && j<cols){
if(target<array[i][j])
i--;
else if(target>array[i][j])
j++;
else
return true;
}
return false;
}
}
4、涉及知识
数组
二、替换空格
1、题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2、题目分析
初拿到此题目,我们可以很自然的想到,每次将“ ”替换为“%20”时,整个字符串的长度会加2,因此问题的关键就在于替换的策略。
(1)当选择从前往后替换时,每碰到一个“ ”,替换为“%20”,然后将该空格后面的字符依次后移,此种方式移动的次数过多,故不采用。
(2)当选择从后往前替换时,每个字符只需移动一次即可。
3、具体实现
public class Solution {
public String replaceSpace(StringBuffer str) {
int spacenum = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ')
spacenum++;
}
int indexOld = str.length()-1;
int newLength = str.length() + spacenum*2;
int indexNew = newLength-1;
str.setLength(newLength);
for(;indexOld >= 0 && indexOld < newLength; --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();
}
}
另外一种利用StringBuffer处理。
public class Solution {
public String replaceSpace(StringBuffer str) {
StringBuffer out=new StringBuffer();
for (int i = 0; i < str.toString().length(); i++) {
char b=str.charAt(i);
if(String.valueOf(b).equals(" ")){
out.append("%20");
}else{
out.append(b);
}
}
return out.toString();
}
}
4、涉及知识
StringBuffer
三、从尾到头打印链表
1、题目描述
输入一个链表,从尾到头打印链表每个节点的值。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
2、题目分析
本题目以链表为对象,倒序打印链表每个节点的值,很容易联想到栈的结构,“先进后出”,采用Arraylist进行存储。
3、具体实现
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack=new Stack<Integer>();
while(listNode!=null){
stack.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> list=new ArrayList<Integer>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
此外,我们还可以采用ArrayList的方法来做。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arr=new ArrayList<Integer>();
while(listNode!=null){
arr.add(0,listNode.val);
listNode=listNode.next;
}
return arr;
}
}
4、涉及知识
链表、栈