From f055563063145513e6d7d7f106fd6b245cddf870 Mon Sep 17 00:00:00 2001 From: rosela <8010372+rosela@users.noreply.github.com> Date: Sun, 15 Dec 2019 18:15:43 +0800 Subject: [PATCH 1/6] Update NOTE.md --- Week 07/id_076/NOTE.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Week 07/id_076/NOTE.md b/Week 07/id_076/NOTE.md index a6321d6e2..5c21ee946 100644 --- a/Week 07/id_076/NOTE.md +++ b/Week 07/id_076/NOTE.md @@ -1,4 +1,23 @@ # NOTE - +学习位运算,布隆过滤器 +对于位运算一直是自己薄弱环节,通过学习初步了解了基本位运算的的初衷及解决那些问题。 +布隆过滤器了解过,但是没有自己实现过,还需进一步学习。 + +1. 常用位运算操作 + +乘2:x << 2; +除2:x >> 2; +判断一个数是偶数:x & 1; +将最后一位变成1:x | 1; +将右数第k为变成1:x | 1 << (k - 1); +交换a,b: + a ^= b; + b ^= a; + a ^= b; + +判断是2的幂:!(n & (n - 1)); +消除最末尾的1:x = x & (x - 1); +对2^n取余:x & (1 << n - 1); + From d6c75b4ca0b7253fb9d80cd4725284702f0a5db9 Mon Sep 17 00:00:00 2001 From: rosela <8010372+rosela@users.noreply.github.com> Date: Sun, 15 Dec 2019 18:18:11 +0800 Subject: [PATCH 2/6] 076-Week 07 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补交第七周作业 --- Week 07/id_076/LeetCode_146_076.java | 95 ++++++++++++++++++++++++++++ Week 07/id_076/LeetCode_190_076.java | 23 +++++++ Week 07/id_076/LeetCode_191_076.java | 40 ++++++++++++ Week 07/id_076/LeetCode_231_076.java | 24 +++++++ Week 07/id_076/LeetCode_242_076.java | 20 ++++++ 5 files changed, 202 insertions(+) create mode 100644 Week 07/id_076/LeetCode_146_076.java create mode 100644 Week 07/id_076/LeetCode_190_076.java create mode 100644 Week 07/id_076/LeetCode_191_076.java create mode 100644 Week 07/id_076/LeetCode_231_076.java create mode 100644 Week 07/id_076/LeetCode_242_076.java diff --git a/Week 07/id_076/LeetCode_146_076.java b/Week 07/id_076/LeetCode_146_076.java new file mode 100644 index 000000000..7557ca025 --- /dev/null +++ b/Week 07/id_076/LeetCode_146_076.java @@ -0,0 +1,95 @@ +import java.util.HashMap; + +/** + * LRU 缓存 + * 1.使用双向链表实现 + * 2.使用java 自带的 LinkedHashMap 实现 + * + */ +public class LeetCode_146_076 { + + private HashMap map; + private DoubleList cache; + private int cap; + + public LeetCode_146_076(int capacity) { + this.cap = capacity; + map = new HashMap<>(); + cache = new DoubleList(); + } + + public int get(int key) { + if (!map.containsKey(key)) + return -1; + int val = map.get(key).val; + put(key, val); + return val; + } + + public void put(int key, int val) { + Node x = new Node(key, val); + + if (map.containsKey(key)) { + cache.remove(map.get(key)); + cache.addFirst(x); + map.put(key, x); + } else { + if (cap == cache.size()) { + Node last = cache.removeLast(); + map.remove(last.key); + } + cache.addFirst(x); + map.put(key, x); + } + } + + class DoubleList { + private Node head, tail; + private int size; + + public DoubleList() { + head = new Node(0, 0); + tail = new Node(0, 0); + head.next = tail; + tail.prev = head; + size = 0; + } + + public void addFirst(Node x) { + x.next = head.next; + x.prev = head; + head.next.prev = x; + head.next = x; + size++; + } + + public void remove(Node x) { + x.prev.next = x.next; + x.next.prev = x.prev; + size--; + } + + public Node removeLast() { + if (tail.prev == head) + return null; + Node last = tail.prev; + remove(last); + return last; + } + + public int size() { return size; } + + } + + class Node { + public int key, val; + public Node next, prev; + public Node(int k, int v) { + this.key = k; + this.val = v; + } + } +} + + + diff --git a/Week 07/id_076/LeetCode_190_076.java b/Week 07/id_076/LeetCode_190_076.java new file mode 100644 index 000000000..ce47617a8 --- /dev/null +++ b/Week 07/id_076/LeetCode_190_076.java @@ -0,0 +1,23 @@ +/** + * 颠倒32 位无符号整数的二进制位 + * + */ +public class LeetCode_190_076 { + + public int reverseBits(int n) { + int res = 0; + for(int i = 0; i < 32; i++) { + int cur = n & 1; + res += (cur << 31 - i); + + n >>= i; + } + return res; + } + + public static void main(String[] args) { + LeetCode_190_076 leetCode = new LeetCode_190_076(); + int res = leetCode.reverseBits(1); + System.out.println(res); + } +} diff --git a/Week 07/id_076/LeetCode_191_076.java b/Week 07/id_076/LeetCode_191_076.java new file mode 100644 index 000000000..015c06a3b --- /dev/null +++ b/Week 07/id_076/LeetCode_191_076.java @@ -0,0 +1,40 @@ +/** + * 1. 循环和位移 + * 使用 & 操作 != 0 确认二进制位是否为1 + * 2. 消除最后的1 + * + */ +public class LeetCode_191_076 { + + public int hammingWeight(int n) { + int size = 0; + int mark = 1; + + for(int i = 0; i < 32; i++){ + if((n & mark) != 0) { + size ++; + } + mark <<= 1; + } + return size; + } + + public int hammingWeight2(int n) { + int size = 0; + while(n != 0){ + size ++; + n &= (n - 1); + } + return size; + } + + public static void main(String[] args) { + LeetCode_191_076 leetCode = new LeetCode_191_076(); + int size = leetCode.hammingWeight(3); + System.out.println(size); + + int size2 = leetCode.hammingWeight2(3); + System.out.println(size2); + + } +} diff --git a/Week 07/id_076/LeetCode_231_076.java b/Week 07/id_076/LeetCode_231_076.java new file mode 100644 index 000000000..fac74fe9a --- /dev/null +++ b/Week 07/id_076/LeetCode_231_076.java @@ -0,0 +1,24 @@ +/** + * 判断是否2的幂次方 + * 2的幂次方, n & (n - 1) == 0 + */ +public class LeetCode_231_076 { + + public boolean isPowerOfTwo(int n) { + if(n <= 0){ + return false; + } + + if((n & (n - 1)) == 0) { + return true; + } else { + return false; + } + } + + public static void main(String[] args) { + LeetCode_231_076 leetCode = new LeetCode_231_076(); + boolean flag = leetCode.isPowerOfTwo(3); + System.out.println(flag); + } +} diff --git a/Week 07/id_076/LeetCode_242_076.java b/Week 07/id_076/LeetCode_242_076.java new file mode 100644 index 000000000..90b806d6e --- /dev/null +++ b/Week 07/id_076/LeetCode_242_076.java @@ -0,0 +1,20 @@ +import java.util.Arrays; + +/** + * 有效的字母异位词 + * + */ +public class LeetCode_242_076 { + + public boolean isAnagram(String s, String t) { + if (s.length() != t.length()) { + return false; + } + + char[] str1 = s.toCharArray(); + char[] str2 = t.toCharArray(); + Arrays.sort(str1); + Arrays.sort(str2); + return Arrays.equals(str1, str2); + } +} From 83c30997da7cd469d4179dd72394d56310bd13bf Mon Sep 17 00:00:00 2001 From: rosela <8010372+rosela@users.noreply.github.com> Date: Sun, 15 Dec 2019 18:37:35 +0800 Subject: [PATCH 3/6] Create NOTE.md --- Week 08/NOTE.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Week 08/NOTE.md diff --git a/Week 08/NOTE.md b/Week 08/NOTE.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Week 08/NOTE.md @@ -0,0 +1 @@ + From b1a0cf521cff09f9d5e1b2fc3e43b476e1cb56ef Mon Sep 17 00:00:00 2001 From: rosela <8010372+rosela@users.noreply.github.com> Date: Sun, 15 Dec 2019 18:38:30 +0800 Subject: [PATCH 4/6] Create NOTE.md --- Week 08/id_076/NOTE.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Week 08/id_076/NOTE.md diff --git a/Week 08/id_076/NOTE.md b/Week 08/id_076/NOTE.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Week 08/id_076/NOTE.md @@ -0,0 +1 @@ + From fa3de2a31e3e1fd8d76a527413ef35b43b319379 Mon Sep 17 00:00:00 2001 From: rosela <8010372+rosela@users.noreply.github.com> Date: Sun, 15 Dec 2019 18:38:50 +0800 Subject: [PATCH 5/6] Delete NOTE.md --- Week 08/NOTE.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Week 08/NOTE.md diff --git a/Week 08/NOTE.md b/Week 08/NOTE.md deleted file mode 100644 index 8b1378917..000000000 --- a/Week 08/NOTE.md +++ /dev/null @@ -1 +0,0 @@ - From 915cb6591df78c4097ed1b642f96fbf34d9bd413 Mon Sep 17 00:00:00 2001 From: rosela <8010372+rosela@users.noreply.github.com> Date: Sun, 15 Dec 2019 18:40:56 +0800 Subject: [PATCH 6/6] 076-Week 08 --- Week 08/id_076/LeetCode_300_076.java | 27 +++++++++++++++++++ Week 08/id_076/LeetCode_541_076.java | 39 ++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 Week 08/id_076/LeetCode_300_076.java create mode 100644 Week 08/id_076/LeetCode_541_076.java diff --git a/Week 08/id_076/LeetCode_300_076.java b/Week 08/id_076/LeetCode_300_076.java new file mode 100644 index 000000000..3574374a8 --- /dev/null +++ b/Week 08/id_076/LeetCode_300_076.java @@ -0,0 +1,27 @@ +/** + * 最长上升子序列 + * 1.暴力解法,采用递归实现 + * 2.增加递归中间计算缓存 + * + */ +public class LeetCode_300_076 { + + public int lengthOfLIS(int[] nums) { + return lengthofLIS(nums, Integer.MIN_VALUE, 0); + } + + public int lengthofLIS(int[] nums, int prev, int curpos) { + if (curpos == nums.length) { + return 0; + } + int taken = 0; + if (nums[curpos] > prev) { + taken = 1 + lengthofLIS(nums, nums[curpos], curpos + 1); + } + int nottaken = lengthofLIS(nums, prev, curpos + 1); + return Math.max(taken, nottaken); + } +} + + + diff --git a/Week 08/id_076/LeetCode_541_076.java b/Week 08/id_076/LeetCode_541_076.java new file mode 100644 index 000000000..0bd7ba85c --- /dev/null +++ b/Week 08/id_076/LeetCode_541_076.java @@ -0,0 +1,39 @@ +/** + * 翻转字符串 + * + */ +public class LeetCode_541_076 { + + public String reverseStr(String s, int k) { + char[] s_arr = s.toCharArray(); + + for(int i = 0;i < s_arr.length;){ + //反转k + if(i + k >= s_arr.length){ + reverseArr(s_arr,i,s_arr.length - 1); + break; + }else{ + reverseArr(s_arr,i,i + k-1); + } + i += k; + + //跳过k + if(i + k >= s_arr.length){ + break; + } + i += k; + } + return String.valueOf(s_arr); + } + + public void reverseArr(char[] arr , int from , int end){ + for(int i = from , j = end; i < j;i++ , j--){ + char t = arr[i]; + arr[i] = arr[j]; + arr[j] = t; + } + } +} + + +