剑指offer---java
1.二维数据中的查找
题目描述:(时间限制2秒,空间限制64M)
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
暴力双层嵌套for循环
通过两层for循环查找
public class Solution {
public boolean Find(int target, int[][] array) {
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[0].length; j++){
if(array[i][j] == target){
return true;
}
}
}
return false;
}
}
二分产找算法
由于题目中已经提示,每行都是由左到右递增排列,所有可以将二维数组看作由多个一维数据组成,循环使用二分查找
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i = 0; i < array.length; i++){
int left = 0;
int right = array[0].length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(target > array[i][mid]){
left = mid + 1;
}else if(target < array[i][mid]){
right = mid - 1;
}else{
return true;
}
}
}
return false;
}
}
2.替换空格
题目描述:(时间限制2秒,空间限制64M)
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
每次都对字符串进行操作
public class Solution {
public String replaceSpace(StringBuffer str) {
StringBuffer sb = new StringBuffer();
int index = 0;
String temp = "";
for(int i = 0; i < str.length(); i++){
if(" ".equals(String.valueOf(str.charAt(i)))){
temp = str.substring(index,i);
sb.append(temp).append("%20");
index = i+1;
}
}
//将最后剩余没有空格的部分append到sb后面,如果空格是在最后,index的值通过上面的+1后会大于str.length
if(index <= str.length() -1){
temp = str.substring(index,str.length());
sb.append(temp);
}
return sb.toString();
}
}
也可以每次都char进行操作
public class Solution {
public String replaceSpace(StringBuffer str) {
String s=str.toString();
//String result=s.replace(" ","%20");
char[] strchar=s.toCharArray();
StringBuffer sb=new StringBuffer();
for(int i=0;i<strchar.length;i++){
if(strchar[i]==' '){
sb.append("%20");
}
else{
sb.append(strchar[i]);
}
}
return sb.toString();
}
}
3.从尾到头打印链表
题目描述(时间限制2秒,空间限制64M)
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
/**
* 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) {
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<Integer> stack = new Stack<>();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}