天天看点

剑指offer算法题刷题日常2020年3月21日10:29:27面试题03. 数组中重复的数字面试题04. 二维数组中的查找面试题05. 替换空格面试题06. 从尾到头打印链表

LeetCode刷题记录

  • 面试题03. 数组中重复的数字
    • 思路
    • 代码实现
  • 面试题04. 二维数组中的查找
    • 思路
    • 代码实现
  • 面试题05. 替换空格
    • 思路
    • 方法代码实现
  • 面试题06. 从尾到头打印链表
    • 思路
    • 代码实现

面试题03. 数组中重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

思路

因为题目要求找出任意一个重复的数字,因此以数组第一个元素取出,遍历比较数组剩下的元素,一旦找到结束遍历。

代码实现

public class findRepeatNumber {
    public static void main(String[] args) {
        findRepeatNumber question03 = new findRepeatNumber();
        int[] nums ={3, 1, 2, 3};
        question03.findRepeatNumber(nums);
    }


    public int findRepeatNumber(int[] nums) {
        int repeat=-1;
        for (int i=0;i<nums.length;i++){
            for (int j = 0; j <nums.length; j++) {
                if (i!=j&&nums[i] == nums[j]) {
                    repeat=nums[i];
                    break;
                }
            }
            if (repeat!=-1) {
                break;
            }
        }
        return repeat;
    }
}
           

面试题04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路

  1. 定义temp维度为11,对于一个nm的matrix矩阵,先从矩阵最小值matrix[i][j]开始判断,
  2. 如果target等于matrix[i][j],break,return true
  3. 如果target大于matrix[i][j],i++,j++,
  4. 如果target小于matrix[i][j],遍历最后一行和列
  5. 如果存在,return true 如果不存在,return false

代码实现

public boolean findNumberIn2DArray(int[][] matrix, int target) {
    for (int i = 0; i <matrix.length ; i++) {
        for (int j = 0; j <matrix[i].length ; j++) {
            if (target==matrix[i][j]){
                return true;
            } else if (target>matrix[i][j]) {
                System.out.println("需要下一步扩容");
            }else{
                for (int k = 0; k <j; k++) {
                    if (target==matrix[i][k]){
                        return true;
                    }
                }
                for (int k = 0; k <i; k++) {
                    if (target==matrix[k][j]){
                        return true;
                    }
                }
            }
        }
    }
    return false;
}
           

面试题05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 :

输入:s = “We are happy.”

输出:“We%20are%20happy.”

思路

  1. 由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3

    倍,这样可保证字符数组可以容纳所有替换后的字符。

  2. 获得 s 的长度 length
  3. 创建字符数组 array,其长度为 length * 3
  4. 初始化 size 为 0,size 表示替换后的字符串的长度
  5. 从左到右遍历字符串 s获得 s 的当前字符 c
  6. 如果字符 c 是空格,则令 array[size] = ‘%’,array[size + 1] = ‘2’,array[size +2] = ‘0’,并将 size 的值加 3
  7. 如果字符 c 不是空格,则令 array[size] = c,并将 size 的值加 1 遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串

方法代码实现

public String replaceSpace(String s) {
        int length = s.length();
        char[] array = new char[length * 3];
        int size = 0;
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (c == ' ') {
                array[size++] = '%';
                array[size++] = '2';
                array[size++] = '0';
            } else {
                array[size++] = c;
            }
        }
        String newStr = new String(array, 0, size);
        return newStr;
    }
           

面试题06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 :

输入:head = [1,3,2] 输出:[2,3,1]

思路

栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。

创建一个栈,用于存储链表的节点

创建一个指针,初始时指向链表的头节点

当指针指向的元素非空时,重复下列操作:

将指针指向的节点压入栈内

将指针移到当前节点的下一个节点

获得栈的大小 size,创建一个数组 print,其大小为 size

创建下标并初始化 index = 0

重复 size 次下列操作:

从栈内弹出一个节点,将该节点的值存到 print[index]

将 index 的值加 1

返回 print

代码实现

public int[] reversePrint(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode temp = head;
        while (temp != null) {
            stack.push(temp);
            temp = temp.next;
        }
        int size = stack.size();
        int[] print = new int[size];
        for (int i = 0; i < size; i++) {
            print[i] = stack.pop().val;
        }
        return print;
    }