java算法笔试题(1)

java算法笔试题


【来源:力扣LeetCode



1、找出数组中重复的数字

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

示例 :

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 
限制:

2 <= n <= 100000

java

class Solution {
    
    
    public int findRepeatNumber(int[] nums) {
    
    
        int[] arr=new int[nums.length];
        for(int i=0;i<nums.length;i++){
    
    
            arr[nums[i]]++;
            if(arr[nums[i]]>1) return nums[i];
        }
        return -1;
    }
}

2、二维数组中的查找

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

示例:

现有矩阵 matrix 如下:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。

给定 target = 20,返回 false。

java

class Solution {
    
    
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
    
    
         //如果越界了,还未找到,说明不存在,返回false
         if(matrix == null || matrix.length == 0) {
    
    
            return false;
        }
        //定义两个数组,总数组的长度
        int m = matrix.length, n = matrix[0].length;
        int row = 0, col = n - 1;
        while(row < m && col >= 0) {
    
    
            if(matrix[row][col] > target) {
    
    
                //如果当前位置元素比target大,则--
                col--;
            }else if(matrix[row][col] < target) {
    
    
                //如果当前位置元素比target小,则++
                row++;
            }else {
    
    
                return true;//如果相等,返回true
            }
        }
        return false;
    }
}

3、替换空格

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

示例 :

输入:s = "We are happy."
输出:"We%20are%20happy."

java

class Solution {
    
    
    public String replaceSpace(String s) {
    
    
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
    
    
            char c=s.charAt(i);
            //如果是空格,返回%20
            if(c==' ')
                sb.append("%20");
            //否则返回本身
            else
                sb.append(c);
        }
        //返回打印数据
        return sb.toString();
    }
}

4、斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 :

输入:n = 2
输出:1

输入:n = 5
输出:5

java

class Solution {
    
    
    public int fib(int n) {
    
    
        //如果n小于等于1,直接返回本身
        if (n <= 1) 
            return n;
        //初始化第一二项
        int first = 0;
        int second = 1;
        int result = 0;
       
        while (--n > 0) {
    
    
            result = first + second;
            if (result >= 1000000007) {
    
    
                result -= 1000000007;
            }
            first = second;
            second = result;
        }
        return result;
    }
}

5、旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

示例 1:

输入:[3,4,5,1,2]
输出:1
示例 2:

输入:[2,2,2,0,1]
输出:0

java

class Solution {
    
    
    public int minArray(int[] numbers) {
    
    
        int l = 0, r = numbers.length - 1;
        while (l < r) {
    
    
            int mid = ((r - l) >> 1) + l;
            //只要右边比中间大,那右边一定是有序数组
            if (numbers[r] > numbers[mid]) {
    
    
                r = mid;
            } else if (numbers[r] < numbers[mid]) {
    
    
                l = mid + 1;
             //去重
            } else r--;
        }
        return numbers[l];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41209886/article/details/108809953