剑指Offer刷题总结

半世苍凉 提交于 2020-02-08 03:42:46

1、二维数组中的查找

题目描述:
  在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路:

仔细观察,找规律。
可以从左下角(右上角)开始查找。若当前的数小于目标值,则向右(向下)一个数继续查找;若当前的数大于目标值,则向上(向左)一个数继续查找;等于就不用说了。

代码实现:

 	// 从左下角开始查找
    public static boolean Find(int target, int[][] array) {
        int row = array.length - 1;
        int col = 0;
        while (row >= 0 && col <= array[0].length - 1) {
            if (array[row][col] == target)
                return true;
            if (array[row][col] > target)
                row--;
            else
                col++;
        }
        return false;
    }

2、替换空格

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

解题思路:

我是直接从头到尾遍历,遇到空格就替换。

代码实现:

public String replaceSpace(StringBuffer str) {
  	for(int i = 0; i < str.length(); i++){
        if(str.charAt(i) == ' ')
            str.replace(i, i + 1, "%20");
    }
    return str.toString();
}

3、从尾到头打印链表

题目描述:
  输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

解题思路:

  1. 反转,可以利用栈的先进后出特性来解决。
  2. 这道题其实可以利用ArrayList类中add(int index, int element)方法,但每次往list添加元素前,它要先把list中所有元素往后移动一个单位再将新元素添加进去,这个比较费时。

代码实现:

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.LinkedList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        LinkedList<Integer> stack = new LinkedList<>();
        while (listNode != null) {
            stack.push(listNode.val);
            listNode = listNode.next;
        }
        ArrayList<Integer> list = new ArrayList<>();
        while (!stack.isEmpty()) {
            list.add(stack.pop());
        }
        return list;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!