面试题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 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
- 定义temp维度为11,对于一个nm的matrix矩阵,先从矩阵最小值matrix[i][j]开始判断,
- 如果target等于matrix[i][j],break,return true
- 如果target大于matrix[i][j],i++,j++,
- 如果target小于matrix[i][j],遍历最后一行和列
- 如果存在,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 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3
倍,这样可保证字符数组可以容纳所有替换后的字符。 - 获得 s 的长度 length
- 创建字符数组 array,其长度为 length * 3
- 初始化 size 为 0,size 表示替换后的字符串的长度
- 从左到右遍历字符串 s获得 s 的当前字符 c
- 如果字符 c 是空格,则令 array[size] = ‘%’,array[size + 1] = ‘2’,array[size +2] = ‘0’,并将 size 的值加 3
- 如果字符 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;
}