剑指offer--java(前20道题)--更新中--非最佳答案,只是我自己的笔记

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

猜你喜欢

转载自www.cnblogs.com/leeeeemz/p/12769459.html