java算法笔试题
【来源:力扣LeetCode】
在一个长度为 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;
}
}
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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];
}
}