笔者自述:
一直有一个声音也一直能听到身边的大佬经常说,要把算法学习搞好,一定要重视平时的算法学习,虽然每天也在学算法,但是感觉自己一直在假装努力表面功夫骗了自己,没有规划好自己的算法学习和总结,因为后半年也该找实习了,所以每日的算法题要进行恶补,勤能补拙,因此有了这一个算法日记系列;
必读: 大佬你好,感谢您的阅读,这篇文章是我的算法笔记,方便我每日回顾;
为了不耽误您的时间,我把本篇日记的考点方向和算法知识总结列出来,如果对您有需要要就进行阅读
也希望对您有帮助,和您一起通关算法!致谢
算法语言:java
题目来源:力扣–书本–初级算法,可以在力扣中搜索相关题名找到更多解法和大神方法
本文知识点:
addLast(E e):将元素添加到链表末尾,相当于将元素压入栈顶。
removeLast():从链表末尾删除一个元素,相当于弹出栈顶元素。
getLast():获得链表末尾的元素,相当于读取栈顶元素。 创建栈:
LinkedList
创建栈,stack = new LinkedList<>();
stack.addLast(1);
将1入栈
int top = stack.removeLast();
将 1出栈,并赋值给 top
int top = stack.getLast();
获得栈顶元素,即 1
stack.add(1, 4);
在栈中的第二个位置插入元素 4
stack.remove(1);
删除栈中的第二个元素
StringBuilder():
无参构造方法,创建一个空的StringBuilder对象appen()
:向StringBuilder对象的末尾添加指定的数据insert()
向指定位置插入数据delete()
删除指定位置的数据replace()
替换指定位置的数据reverse()
将对象中的顺序颠倒lenth()
获取StringBuilder对象中的长度切记:最后需要转化成对应的输出类型。:
详细可针对具体题目具体分析~~
public class day6_14_0_update {
//递归思路 递归到尾部 然后进行回溯
//代码非常的简单,而且也容易理解
ArrayList<Integer> tmp = new ArrayList<>();
public int[] reversePrint(ListNode head){
recur(head);
int[] res = new int[tmp.size()];
for(int i =0;i<res.length;i++)
res[i] = tmp.get(i);
return res;
}
//通过递归到链表尾部,如果是空的话,就一层一层回溯,就实现了将尾部值依次添加到链表中
public void recur(ListNode head){
if(head == null)
return;
recur(head.next);
tmp.add(head.val);
}
//-------------------------------------------------------------------
//使用辅助栈来 栈的特性 先进后出 使用LinkedList 来模拟栈
public int[] reversePrint1(ListNode head){
LinkedList<Integer> stack = new LinkedList<Integer>();
while(head != null){
stack.addLast(head.val);
head = head.next;
}
int [] res = new int[stack.size()];
for(int i =0;i<res.length;i++){
res[i] = stack.removeLast();
}
return res;
}
}
学到的知识:
addLast(E e):将元素添加到链表末尾,相当于将元素压入栈顶。
removeLast():从链表末尾删除一个元素,相当于弹出栈顶元素。
getLast():获得链表末尾的元素,相当于读取栈顶元素。 创建栈:
LinkedList
创建栈,stack = new LinkedList<>();
stack.addLast(1);
将1入栈
int top = stack.removeLast();
将 1出栈,并赋值给 top
int top = stack.getLast();
获得栈顶元素,即 1
stack.add(1, 4);
在栈中的第二个位置插入元素 4
stack.remove(1);
删除栈中的第二个元素
public class day6_14_1 {
//反转链表
//遍历 : 从头开始 直接修改指针指向
public ListNode reverseList(ListNode head){
ListNode cur = head,pre = null;
while(cur!= null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur= temp;
}
return pre;
}
//递归回溯
public ListNode reverseList1(ListNode head){
return recur(head,null);
}
public ListNode recur(ListNode cur,ListNode pre){
if(cur == null) return pre; //终止条件
ListNode res = recur(cur.next,cur); //递归后继节点
cur.next = pre; // 修改节点引用指向
return res; // 返回反转链表的头节点
}
}
学到的知识:
//简单的链表复制
public Node copyEasyList(Node head){
Node cur = head;
Node dum = new Node(0),pre = dum;
while(cur != null){
Node node = new Node(cur.val);
pre.next = node;
cur = cur.next;
pre = node;
}
return dum.next;
}
理解了这一步,对于下面的复杂链表复制,只需要搞懂两个循环内部意思即可
代码:
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head){
if(head == null){
return null;
}
Node cur = head;
//使用哈希表来进行存储节点信息
Map<Node,Node> map = new HashMap<Node,Node>();
//复制各节点,并建立 原节点- 新节点的map映射
while(cur != null){
map.put(cur,new Node(cur.val));
cur =cur.next;
}
cur = head;
while(cur != null){
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
cur =cur.next;
}
return map.get(head);
}
}
学到的知识点: 这题感觉挺难的,对我而言 哈哈
public class day6_14_3 {
// 拆分字符,遇见空格替换 时间复杂度为O(n)
public String replaceSpace(String s){
String a ="";
for(int i =0;i<s.length();i++){
if(s.charAt(i) == ' '){
a+="%20";
continue;
}
a+=s.charAt(i);
}
return a;
}
//使用 StringBuilder 来进行修改
public String replaceSpace1(String s){
StringBuilder res = new StringBuilder();
for(Character c: s.toCharArray()){
if(c == ' ')
res.append("%20");
else
res.append(c);
}
return res.toString();
}
//直接使用API中的方法
public String replaceSpace2(String s){
return s.replace(" ","%20");
}
}
学到的知识:
StringBuilder():
无参构造方法,创建一个空的StringBuilder对象appen()
:向StringBuilder对象的末尾添加指定的数据insert()
向指定位置插入数据delete()
删除指定位置的数据replace()
替换指定位置的数据reverse()
将对象中的顺序颠倒lenth()
获取StringBuilder对象中的长度切记:最后需要转化成对应的输出类型。
代码:
public class day6_14_4 {
//简陋的实现方法 时间复杂度高
public String reverseLeftWords(String s,int n){
String a = "";
String b = "";
for(int i =0;i<n;i++){
a += s.charAt(i);
}
b = s.replace(a,"");
return b+a;
}
//使用StringBuilder
public String reverseLeftWords1(String s ,int n){
StringBuilder sh = new StringBuilder(s);
for(int i =0;i<n;i++){
sh.append(s.charAt(i));
sh.deleteCharAt(0);
}
return sh.toString();
}
//利用字符串切割操作
public String reverseLeftWords2(String s,int n){
return s.substring(n,s.length())+s.substring(0,n);
}
}
学到的知识: