@songhanshi
2021-01-15T16:54:17.000000Z
字数 9169
阅读 509
Java学习
String转数组 | 数组转String
String str = "abc";
初始化char[]
char cha[] = {'a','2','3','f'};
char[] cha= new char[]{'a','2','3','f'};
char[] cha= new char[4];cha[0]='a';
array转list
String[] array = {"string1","string2","string3"};
//Arrays.asList产生一个Arrays内置的类 其中数组用final表示!
List<String> list = Arrays.asList(array);
// list.add("string4"); 所以不能往其中添加元素
不能进行修改操作。 如需修改操作:
方式1:
List list= new ArrayList<>(Arrays.asList(array));
方式2:
List list = new ArrayList<>(array.length);
Collections.addAll(list,array);
List转array
List<String> list2 = new ArrayList<>();
list2.add("t1");
list2.add("t2");
list2.add("t3");
//toArray中不指定参数 只能转换为Object类型
String[] strings = list2.toArray(new String[list2.size()]);
代码
import java.util.LinkedList;
import java.util.Queue; // 队列,可以存储一组元素,但是存取元素必须遵循先进先出原则 JDK
import java.util.Deque; // 双端队列 两端都可以进出队列 双端队列接口继承自队列接口(Queue)
public class Test {
public static void main(String[] args) {
// -----------------------队列--Queue---------------------------
/**队列,可以存储一组元素,但是存取元素必须遵循先进先出原则 JDK
*/
Queue<String> queue = new LinkedList<>();
//入队-- boolean offer(E e):将一个对象添加到队尾,添加成功返回true
queue.offer("one");
queue.offer("two");// [one, two]
//出队-- 从队首获取元素,获取后该元素就从队列中给移除 E poll():从队首删除并返回一个元素
String str = queue.poll();// [two]
// 获取队首元素 -- E peek():返回队首元素(但是不删除)
// -----------------------双端队列--Deque---------------------------
/**双端队列 两端都可以进出队列 双端队列接口继承自队列接口(Queue)
*/
// boolean offer(E e):将一个对象添加到队尾,添加成功返回true
// boolean offerFirst(E e):将一个对象添加到队首,添加成功返回true
// boolean offerLast(E e):将一个对象添加到队尾,添加成功返回true
// *
// E poll():从队首删除并返回一个元素 E
// pollFirst():从队首删除并返回一个元素 E
// pollLast():从队尾删除并返回一个元素
// E peek():返回队首元素(但是不删除)
Deque<String> deque = new LinkedList<String>();
deque.offer("a");
deque.offer("aa");
deque.offerFirst("b");// 从队首添加
deque.offerLast("c");// 从队尾添加
System.out.println(deque);// [b, a, aa, c]
// -----------------------栈--Deque---------------------------
/** 栈1
* 如果将Deque限制为只能从一端进和出,则可以实现 栈(Stack)
*/
//入栈:push(offerFirst)
//出栈:pop(pollFirst) 栈遵循先进后出(FILO)原则
Deque<String> stack = new LinkedList<>();
stack.push("1");//入栈
stack.push("2");
stack.push("3"); // 栈:[3, 2, 1]
while (stack.size() > 0) {
System.out.println(stack.pop());//出栈
}
// ----------------------栈--Stack---------------------------
/**Stack类2
* 栈:桶型或箱型数据类型,后进先出,相对堆Heap为二叉树类型,可以快速定位并操作
*/
// 栈:桶型或箱型数据类型,后进先出,相对堆Heap为二叉树类型,可以快速定位并操作
// Stack<E>,支持泛型
// public class Stack<E> extends Vector<E>
// Stack的方法调用的Vector的方法,被synchronized修饰,为线程安全(Vector也是)
// Stack methods:
// push : 把项压入堆栈顶部 ,并作为此函数的值返回该对象
// pop : 移除堆栈顶部的对象,并作为此函数的值返回该对象
// peek : 查看堆栈顶部的对象,,并作为此函数的值返回该对象,但不从堆栈中移除它
// empty : 测试堆栈是否为空
// search : 返回对象在堆栈中的位置,以 1 为基数
}
}
PriorityQueue是从JDK1.5开始提供的新的数据结构接口
使用参考:L - 0179】e - x - 最大数
一般使用
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return o1.compareTo(o2);
}
});
具体:https://www.jb51.net/article/181195.htm
// 最小优先队列,直接 return o1.compareTo(o2);
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return o1 < o2 ? -1 : 1;
/* e.g., return o1.compareTo(o2); */
}
});
// 最大优先队列,则反过来 return o2.compareTo(o1);
return o1 > o2 ? -1 : 1;
自然排序
public class Test {
private static PriorityQueue<Student> priorityQueue = new PriorityQueue<>();
public static void main(String[] args) {
priorityQueue.add(new Student(10));
priorityQueue.add(new Student(30));
priorityQueue.add(new Student(26));
while (true) {
Object poll = priorityQueue.poll();
if(poll != null){
System.out.println(poll);
}else{
break;
}
}
}
}
class Student implements Comparable<Student>{
private int age;
public Student(int age) { this.age = age; }
@Override
public String toString() { return "Student{" + "age=" + age + '}'; }
@Override // 重点
public int compareTo(Student o) {
return this.age - o.age;//从小到大
}
}
比较器
import java.util.Comparator;
import java.util.PriorityQueue;
public class Test {
private static PriorityQueue<Student> priorityQueue = new PriorityQueue<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();//小到大
}
});
public static void main(String[] args) {
priorityQueue.add(new Student(10));
priorityQueue.add(new Student(30));
priorityQueue.add(new Student(26));
while (true) {
Object poll = priorityQueue.poll();
if(poll != null){
System.out.println(poll);
}else{
break;
}
}
}
}
class Student {
private int age;
public Student(int age) { this.age = age; }
@Override
public String toString() { return "Student{" + "age=" + age + '}'; }
public int getAge() { return age; }
}
链接下面有微软面试面经推荐
https://blog.csdn.net/u010712012/article/details/102557452
1.Leetcode103
2.Leetcode25
3.找出第一个缺失的数
https://www.nowcoder.com/practice/8cc4f31432724b1f88201f7b721aa391?tpId=117&&tqId=1001912
楼上扔两个鸡蛋
https://www.nowcoder.com/practice/d1418aaa147a4cb394c3c3efc4302266?tpId=117&&tqId=1067775
岛屿和帽子
https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e?tpId=117&&tqId=1024684
B+树,从原理慢慢深入,问B+树节点存那些东西,(左右指针,父节点数据,当前节点数据,数据存磁盘,只存指针),问还有么?还有?
堆的结构
https://blog.csdn.net/qq_36186690/article/details/82505569
dcl(双重验证)单例模式的实现 |2
equals()
两个字符串,按照规则判断相等(重写equals),规则是两个字符串相同字符出现的次数相同,遍判定相等。例(AAB 和 ABA 相等)。
生产者消费者(一对一)
10个多线程保证 i从0加到10 (差点翻车,主线程忙等另外10个线程完结)
手写消费者生产者模式
4、算法题:LRU
https://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61?tpId=117&&tqId=1006010
两个抛硬币概率题
D-快排 |3
归并排序 |2
堆排序 |2
优缺点
算法:手写快速排序、插入排序、冒泡排序,并分析时间复杂度和空间复杂度,它们的稳定性。
4.手撕算法,递归二分查找
两个队列实现一个栈 |3
用数组写一个stack
14.算法题,实现一个有 min() 方法的栈,我没用辅助栈,直接在原栈上操作(将最小值重复入栈即可)
L - 0206】e -反转链表 | 3
两两翻转链表
L0021-合并两个有序链表
L0237-删除链表中的节点
判断单链表环 √
141 https://leetcode-cn.com/problems/linked-list-cycle/
有序链表去重
https://www.nowcoder.com/practice/c087914fae584da886a0091e877f2c79?tpId=117&&tqId=664
NC2 重排链表
https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b?tpId=117&&tqId=603
删除链表中第k大的节点(以为是找第k大的数,听录音才听清是删除第k大的节点)
删除链表的倒数第n个节点 时间复杂度 O(N)
空间复杂度O(1)复杂度判断有环
链表复制-sw
算法:二叉搜索数与双向链表(这个懵了)
sqrt(x)开个根号,保证小数点后三位精度
double f = 6.23556;
String.format("%.2f", f)
1进制转换
2、NC32 求平方根
https://www.nowcoder.com/practice/09fbfb16140b40499951f55113f2166c?tpId=117&&tqId=677
算法:判断是不是有效IP地址。
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880?tpId=117&&tqId=1024725
算法:接雨水:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
设计题 如何实现洗牌算法
算法题 leetcode 166.分数到小数
手写代码:大数相加(用数组模拟)
12.写一个算法实现从100个人中随机抽5个人中奖,要完全随机
算法题:一共有9匹马3条跑道,每次只可以3条马同时跑,问一共需要几轮可以选出前三名
求一天买入股票的最大收益,一开始说了个n^2的,问怎么降到logn
问邻接表和邻接矩阵,这个没答好。
https://segmentfault.com/a/1190000002685782
如何判断一个图是否有环?
* 、topk
还有堆的实现,堆中插入一个数据如何保证堆还正常(往上迭代)
15.算法题,一个数组中只有一个数是单独出现,其他都是成对,找出这个值(直接说了异或),又问能不能再简化(又说二分就行了,问了问细节)
算法:一个未排序的数组数据范围1-n,其中更改某个值使得新的值范围仍为1-n,求更改的值和重复的值。进阶:改了2个呢?多个呢?范围为x+1-x+n呢?
8.LeetCode 74 矩阵查找
一开始我说从右上角或左下角开始查找,面试官让我讲解思路和时间复杂度,之后他说这不是最优解
最后在面试官的引导下写出来了最优的二分查找
算法:给定一个数组,找出等于目标值的两个下标;单链表的添加和删除。
4.二维求组,由a【0】【0】到a【n】【n】会有多少种情况,只考虑从左到右,从上到下
一个数组找出出现次数最多的一个数,如果多个数出现的次数相同则输出第一个
二维矩阵,每一列从上到下是从小到大排序的,请按顺序输出?
一个数组里面出现第一多的数据
输入: 一个数组。
输出: 判断它是否「几乎有序」。
「几乎有序」指两种情况: 1.交换两个元素后有序 2. 交换一个子串后有序 。
此外要求O(1)空间。
3.输入: 一个长为n的数组。把长为k的窗口从数组头滑动到数组尾。
输出: 每次滑动时窗口内的最大值,即一个长为(n-k+1)的数组。
怎么把一个有序的列表变为无序的
1 矩阵顺时针旋转90度
9.LeetCode 54 螺旋矩阵,做完提问怎样保证不会重复输出
算法:连续子数组的最大和
有主字符串A,子字符串B,在A中查找B
LC 22,Generate Parentheses,给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。
算法:最长不含重复字符的子字符串
8.编程题:查找字符串的子字符串第一个字母的索引
算法:找一个字符串中第一个只出现一次的字符下标
3、NC121 字符串的排列
1、NC113 验证IP地址
上来先手撕算法,字符串中的最大回文子串
算法:给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
2 最长回文子串
最长公共字串
https://leetcode-cn.com/problems/longest-common-prefix/
返回字符串最长重复子串?
全排列,回溯法使用字典->follow up 更小开销 回溯法不使用字典
https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=117&&tqId=23291
非递归实现的中序遍历
94 https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
树打印-之打印
验证二叉树是不是合法,用递归的方法做出来。
搜索二叉树98 https://leetcode-cn.com/problems/validate-binary-search-tree/
法:给前序和中序遍历,重建二叉树
算法:二叉树的镜像
算法:从上到下打印二叉树
leetcode 103. 二叉树的锯齿形层次遍历
二叉树中序遍历非递归
中序非递归
https://www.nowcoder.com/practice/a9fec6c46a684ad5a3abd4e365a9d362?tpId=117&&tqId=1008937
给定数值求二叉树根节点到叶子结点之和等于该数值的路径。
二叉树p、q节点的的最近祖先
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116?tpId=117&&tqId=1024325
NC16 判断二叉树是否对称
https://www.nowcoder.com/practice/1b0b7f371eae4204bc4a7570c84c2de1?tpId=117&&tqId=645
树的镜像交换
比较简单,写了递归,又写了基于层序遍历的非递归版本
二叉树中序遍历非递归1、 NC16 判断二叉树是否对称
https://www.nowcoder.com/practice/1b0b7f371eae4204bc4a7570c84c2de1?tpId=117&&tqId=645
算法:N皇后
算法:剪绳子(贪心或递归解决)
跳台阶
70
JZ-10
•f(0)=0;f(1)=1;
f(n)=f(n-1)+f(n-2)
求f(n)
斐波那契数列
509
背包问题