
【算法技巧】
晓风残月一望关河萧索
志存高远,脚踏实地。
路漫漫其修远兮,吾将上下而求索。
展开
-
【详解】【技巧】计算二进制1的个数:x=x &x-1
计算二进制位1的个数:n=n&(n-1),每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。详见这一题:力扣public int hammingWeight(int n) { int count = 0; while(n != 0){ count++; n = n & (n - 1); ...原创 2022-04-05 23:17:54 · 508 阅读 · 0 评论 -
【详解】【计算质数】:计算质数的个数,判断质数,转换成质数,并计数1的个数Integer.bitCount(x), n = n & (n - 1);
1、判断一个数是不是质数private static boolean isPrime(int x) { if (x < 2) { return false; } for (int i = 2; i * i <= x; ++i) { if (x % i == 0) { return false; } } return true;}2、计算质数的个数class Solut原创 2022-04-05 23:14:51 · 494 阅读 · 0 评论 -
【详解】【java】ACM、OJ模式下的输入和输出:Scanner的使用
所有计算机的语言,用户操作都是围绕着:输入和输出设计的。直接敲一遍下面的代码即可。记得敲一个情况,一个注释哦import java.util.Scanner;public class ACM { public static void main(String[] args) { // 输入接收器 Scanner scanner = new Scanner(System.in); // 不同的类型接收 byte next1原创 2022-03-29 22:19:11 · 1241 阅读 · 0 评论 -
【详解】Arrays.copyOf() 的使用
数组的复制:返回的是一个新的数组对象Arrays.copyOf(int[] array, int length):第一个变量表示原来的数组对象第二个变量表示新的数组的长度,如果新数组的长度超过原数组的长度,保留数组元素的默认基本类型的值。 int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, 5); int[] arr3 = Arrays.copyOf(arr1, 10); for(i.原创 2022-03-26 20:51:17 · 3926 阅读 · 0 评论 -
【详解】链表的复制,使用Map集合
①有2个指针,一个指针是next,指向的是下一个结点。一个是random指针,指向的是下一个随机结点。②现在对真个链表进行复制,可以分为2个大部分。第一个部分是复制链表的结点; 第二部分是复制链表的指针。使用Map集合做映射,key代表原链表的结点,value代表的是复制链表的对应的结点。构建新链表的next,random指针。具体看这题:复杂链表的复制_牛客题霸_牛客网...原创 2021-12-06 12:16:42 · 560 阅读 · 0 评论 -
【详解】链表,求倒数第k个结点
求倒数第几个,这种类型的题可以有一个统一做法。定义两个指针,head1,head2。题目求的是倒数第k个结点后的链表。先让head1往后走k步,当head1走k步的时候,这个时候head1,head2同时往右走,直到head1下一个为Null。则head2指向的就是倒数第K个结点。...原创 2021-12-05 16:27:29 · 121 阅读 · 0 评论 -
【详解】:链表中 slow,fast快慢指针的使用
结合这道题:【链表】【打卡第139道】:《剑指Offer》3刷:2种方法:JZ23 链表中环的入口结点_CodingLJ-优快云博客结合下图自己跑一遍定理记住:若链表是有环的链表。定义两个指针,一个slow,一个fast指针,同时从链表的头部出发,fast指针走2步,slow指针走1步。若该链表有环,那么fast和slow必然会在环内相遇。也可能在环的入口结点,也可能在环中的任意其他结点。此时只需要将slow,fast中的其中一个指针再指向链表的头部pHead,另一个不变(在环内),接下原创 2021-12-05 13:13:26 · 909 阅读 · 0 评论 -
【算法技巧】int[] count = new int[26]; count[s.charAt(i) - ‘a‘]++;
int[] count = new int[26]; for(int i = 0;i < s.length();i++){ count[s.charAt(i) - 'a']++; }int是32位的,英文字母有26个。所以可以使用int[] count = new int[26];存储字符串中出现字母。具体的话,count[s.charAt(i) - 'a']:s.charAt(i) - 'a',求字母之间的a...原创 2021-11-28 23:23:52 · 3589 阅读 · 0 评论