03数组中重复的数字
题目
代码
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> res=new HashSet<Integer>();
int repeat=-1;
for(int num:nums){
if(!res.add(num)){
repeat=num;
break;
}
}
return repeat;
}
}
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - 1])
return nums[i];
}
return -1;
}
注意:
- 本题目多使用HashSet,继承自HashMap,遇到重复元素就会添加失败。
04二维数组中的查找
题目
代码
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
boolean flag=false;
if(matrix==null|| matrix.length == 0 || matrix[0].length == 0){
return false;
}
else if(matrix!=null ){
int i=0;
int j=matrix[0].length-1;
while(i<=matrix.length-1&&j>=0){
if(matrix[i][j]==target){
flag=true;
break;
}else if( matrix[i][j]>target){
j--;
}
else i++;
}
}
return flag;
}
}
注意:
- 选取右上角数组元素进行比较,根据大小关系缩小查找范围,不断取右上角进行对比。
- 不能用左上和右下,可以用左下或右上。
05替换空格
题目
代码
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < s.length(); i++){
char c = s.charAt(i);
if(c == ' ') sb.append("%20");
else sb.append(c);
}
return sb.toString();
}
}
注意:
- 替换类题目,字符串大小会改变。面试时要问清楚在原字符串修改还是自己建立新的字符串。
- 假设必须在原字符串修改思路如下:
- 时间复杂度O(n)
- 遍历字符串,得到空格总数n;字符串长度len1;
- 替换后字符串长度len2为 : 2n+len1
- 准备两个指针p,q; p指向len1-1; q指向len2-1;
- 若p指向处不为空格,就加入到q指向处,并且p,q都前移
- 若p指向处为空格,q指向处一边前移一边依次插入三个字符,并且p,q都前移
- 输出改变后的字符串
06从尾到头打印链表
题目
代码
class Solution {
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;
}
}
注意:
- 链表时考察最频繁的数据结构,它是动态的,创建时不需要知道长度
- 由于没有闲置内存,它的空间效率比数组高
- 反转指针会改变链表结构,一般打印时是只读操作,不能改变结构
- 使用栈来实现顺序反转
- 递归本质是一个栈结构 但是链表过长的话,使用递归可能导致函数调用栈溢出
- 显式用栈基于循环实现的代码的鲁棒性好些。