diff --git a/Big_data_example/Kafka/pom.xml b/Big_data_example/Kafka/pom.xml
index 14ba924..226850f 100644
--- a/Big_data_example/Kafka/pom.xml
+++ b/Big_data_example/Kafka/pom.xml
@@ -44,6 +44,11 @@
flume-kafka-source
1.9.0
+
+ com.alibaba
+ fastjson
+ 1.2.68
+
diff --git a/Big_data_example/Kafka/src/main/java/com/atguigu/kafka/consumer/KafkaConsumerDemoTest.java b/Big_data_example/Kafka/src/main/java/com/atguigu/kafka/consumer/KafkaConsumerDemoTest.java
new file mode 100644
index 0000000..a4bf377
--- /dev/null
+++ b/Big_data_example/Kafka/src/main/java/com/atguigu/kafka/consumer/KafkaConsumerDemoTest.java
@@ -0,0 +1,70 @@
+package com.atguigu.kafka.consumer;
+
+
+import com.alibaba.fastjson.JSON;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.clients.consumer.ConsumerRecords;
+import org.apache.kafka.clients.consumer.KafkaConsumer;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * kafka消费者:自动提交offset
+ *
+ *
+ */
+public class KafkaConsumerDemoTest {
+
+ public static void main(String[] args) {
+
+ //0.创建配置对象
+ Properties props =new Properties();
+ //kafka集群的位置
+ props.put("bootstrap.servers", "Ding202:9092");
+ //消费者组id
+ props.put("group.id", "suibian");
+ //自动提交offset
+ props.put("enable.auto.commit", "true");
+ //offset提交的间隔
+ props.put("auto.commit.interval.ms", "1000");
+ //key和value的反序列化器
+ props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
+ props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
+
+
+ //1.创建消费者对象
+ KafkaConsumer kafkaConsumer = new KafkaConsumer(props);
+
+ //2.订阅主题topic
+ //设置一个对象去封装topic,默认是用的collection,但是小的list现在就足够了
+ List topic = new ArrayList();
+ topic.add("pykafka_demo");
+// topic.add("hello");
+ //如果没有这个主题,他会自动帮你创建一个,但是这个主题默认的是一个分区一个副本
+ //topic.add("second");
+ kafkaConsumer.subscribe(topic);
+
+ //3.持续消费数据
+ while (true){
+ //和kafka的consumer一样,会去主动拉去数据,所以需要设置超时拉取时间
+ //返回一个集合
+ ConsumerRecords records = kafkaConsumer.poll(Duration.ofSeconds(2));
+ for (ConsumerRecord record : records) {
+ //拿到每一个record,将他打印出来
+ System.out.println("消费到:"+record.topic()+
+ ":"+record.partition()+
+ ":"+record.offset()+
+ ":"+record.key()+
+ ":"+record.value());
+ System.out.println(JSON.toJSONString(JSON.parseObject(record.value())));
+ }
+ }
+ //关闭消费者对象
+ //kafkaConsumer.close();
+
+ }
+
+}
diff --git a/Big_data_example/rt-gmall-parent/gmall-publisher/src/main/java/com/atguigu/rtgmall/controller/format.json b/Big_data_example/rt-gmall-parent/gmall-publisher/src/main/java/com/atguigu/rtgmall/controller/format.json
index 1a66e8b..2b19807 100644
--- a/Big_data_example/rt-gmall-parent/gmall-publisher/src/main/java/com/atguigu/rtgmall/controller/format.json
+++ b/Big_data_example/rt-gmall-parent/gmall-publisher/src/main/java/com/atguigu/rtgmall/controller/format.json
@@ -231,16 +231,4 @@
}
//3d字符云
-{
- "status": 0,
- "msg": "",
- "data": [
- {
- "name": "海门",
- "value": 1
- },
- {
- "name": "鄂尔多斯",
- "value": 1
- }
- ]}
\ No newline at end of file
+{"status": 0,"msg": "", "data": [{"name": "海门", "value": 1}, {"name": "鄂尔多斯", "value": 1}]}
\ No newline at end of file
diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/singlestack/LC_42_Trap.java b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/singlestack/LC_42_Trap.java
new file mode 100644
index 0000000..01b2138
--- /dev/null
+++ b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/singlestack/LC_42_Trap.java
@@ -0,0 +1,49 @@
+package com.markilue.leecode.hot100.interviewHot.singlestack;
+
+import org.junit.Test;
+
+import java.util.LinkedList;
+
+/**
+ *@BelongsProject: Leecode
+ *@BelongsPackage: com.markilue.leecode.hot100.interviewHot.singlestack
+ *@Author: markilue
+ *@CreateTime: 2023-05-17 10:50
+ *@Description: TODO 力扣42 接雨水
+ *@Version: 1.0
+ */
+public class LC_42_Trap {
+
+ @Test
+ public void test() {
+
+ int[] height = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1};
+ System.out.println(trap(height));
+
+ }
+
+
+ //单调栈解法:当前位置能积多少水本质上就是看看左右最高的位置的高度,取最小值
+ //当需要左右最高位置的高度时,单调栈来确定
+ public int trap(int[] height) {
+
+ LinkedList stack = new LinkedList<>();
+ int result = 0;
+
+ for (int i = 0; i < height.length; i++) {
+ while (!stack.isEmpty() && height[stack.peek()] < height[i]) {
+ Integer top = stack.pop();
+ if (stack.isEmpty()) {
+ continue;
+ }
+ Integer left = stack.peek();//必须要有左边界
+ int curMin = Math.min(height[left] , height[i]);
+ result += (curMin - height[top])*(i-left-1);//注意这里要乘长度
+ }
+ stack.push(i);
+ }
+
+ return result;
+
+ }
+}
diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/window/LC_76_MinWindow.java b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/window/LC_76_MinWindow.java
index 5bbb1a0..9bef103 100644
--- a/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/window/LC_76_MinWindow.java
+++ b/Leecode/src/main/java/com/markilue/leecode/hot100/interviewHot/window/LC_76_MinWindow.java
@@ -25,7 +25,7 @@ public class LC_76_MinWindow {
@Test
public void test1() {
String s = "ADOBECODEBANC", t = "ABC";
- System.out.println(minWindow4(s, t));
+ System.out.println(minWindow5(s, t));
}
@@ -278,4 +278,56 @@ public class LC_76_MinWindow {
}
+
+
+ //四刷
+ public String minWindow5(String s, String t) {
+ HashMap need = new HashMap<>();
+
+ for (int i = 0; i < t.length(); i++) {
+ char c = t.charAt(i);
+ need.put(c, need.getOrDefault(c, 0) + 1);
+ }
+
+ HashMap window = new HashMap<>();
+ int left = 0;
+ int right = 0;
+ int minLength = Integer.MAX_VALUE;
+ int start = 0;
+ int diff = need.size();
+
+
+ while (right < s.length()) {
+ char c = s.charAt(right++);
+
+ if (need.containsKey(c)) {
+ Integer count = window.getOrDefault(c, 0) + 1;
+ if (count.equals(need.get(c))) {
+ diff--;
+ }
+ window.put(c, count);
+ }
+
+ while (diff == 0 && left < right) {
+ int cur = right - left;
+ if (cur < minLength) {
+ minLength = cur;
+ start = left;
+ }
+
+ char c1 = s.charAt(left++);
+ if (need.containsKey(c1)) {
+ Integer count = window.get(c1);
+ if (count.equals(need.get(c1))) {
+ diff++;
+ }
+ window.put(c1, count - 1);
+ }
+ }
+ }
+
+ return minLength == Integer.MAX_VALUE ? "" : s.substring(start, start + minLength);
+
+ }
+
}
diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T38_84_LargestRectangleArea.java b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T38_84_LargestRectangleArea.java
index a5238d8..76b1981 100644
--- a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T38_84_LargestRectangleArea.java
+++ b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T38_84_LargestRectangleArea.java
@@ -207,4 +207,40 @@ public class T38_84_LargestRectangleArea {
return maxArea;
}
+ //三刷:单调栈确定左右边界位置
+ public int largestRectangleArea5(int[] heights) {
+
+ int n = heights.length;
+ LinkedList stack = new LinkedList<>();
+ int[] left = new int[n];
+ int[] right = new int[n];
+
+ for (int i = 0; i < n; i++) {
+ while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
+ stack.pop();//寻找第一个比当前值小的数的位置
+ }
+ left[i] = stack.isEmpty() ? -1 : stack.peek();
+ stack.push(i);
+ }
+ stack.clear();
+
+ //反向遍历确定右边界
+ for (int i = n - 1; i >= 0; i--) {
+ while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
+ stack.pop();//寻找第一个比当前值小的数的位置
+ }
+ right[i] = stack.isEmpty() ? n : stack.peek();
+ stack.push(i);
+ }
+
+ //确定每一个位置的最大矩形大小
+ int result = 0;
+ for (int i = 0; i < heights.length; i++) {
+ result = Math.max(result, (right[i] - left[i] - 1) * heights[i]);
+ }
+
+ return result;
+
+ }
+
}
diff --git a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T46_105_BuildTree.java b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T46_105_BuildTree.java
index 97c71bf..5d244c5 100644
--- a/Leecode/src/main/java/com/markilue/leecode/hot100/second/T46_105_BuildTree.java
+++ b/Leecode/src/main/java/com/markilue/leecode/hot100/second/T46_105_BuildTree.java
@@ -20,7 +20,7 @@ public class T46_105_BuildTree {
public void test() {
int[] preorder = {3, 9, 20, 15, 7};
int[] inorder = {9, 3, 15, 20, 7};
- TreeUtils.printTreeByLevel(buildTree1(preorder,inorder));
+ TreeUtils.printTreeByLevel(buildTree4(preorder, inorder));
}
int index = 0;
@@ -91,9 +91,6 @@ public class T46_105_BuildTree {
}
-
-
-
//官方最快
private int in = 0;
private int pre = 0;
@@ -115,4 +112,56 @@ public class T46_105_BuildTree {
node.right = build(preorder, inorder, stop);
return node;
}
+
+
+ //二刷
+ public TreeNode buildTree4(int[] preorder, int[] inorder) {
+ index = 0;
+ return buildChild1(preorder, inorder, 0, inorder.length);
+ }
+
+ public TreeNode buildChild1(int[] preorder, int[] inorder, int inStart, int inEnd) {
+ if (inStart >= inEnd || index >= inorder.length) {
+ return null;
+ }
+ int val = preorder[index++];
+ TreeNode root = new TreeNode(val);
+ int index = findIndex1(inorder, inStart, inEnd, val);//事实上,找index的过程本质上就是找一个边界
+
+ root.left = buildChild1(preorder, inorder, inStart, index);
+ root.right = buildChild1(preorder, inorder, index + 1, inEnd);
+ return root;
+
+ }
+
+ private int findIndex1(int[] inorder, int inStart, int inEnd, int val) {
+ while (inStart < inEnd) {
+ if (inorder[inStart] == val) {
+ return inStart;
+ }
+ inStart++;
+ }
+ return -1;
+ }
+
+ //尝试官方最快:本质上就是逐步推进来确定边界,不用挨个寻找
+ public TreeNode buildTree5(int[] preorder, int[] inorder) {
+ return build1(preorder,inorder,Integer.MIN_VALUE);//找一个一定不会相等的即可
+ }
+
+ public TreeNode build1(int[] preorder, int[] inorder, int stop) {//只确定右边界
+ if (pre > preorder.length) {
+ return null;
+ }
+ if (inorder[in] == stop) {//遍历到了右边界
+ in++;
+ return null;
+ }
+ TreeNode root = new TreeNode(preorder[pre++]);
+ root.left = build1(preorder, inorder, root.val);
+ root.right = build1(preorder, inorder, stop);
+ return root;
+ }
+
+
}