并查集


class DisjointSet {

    int[] p;
    int count;

    public DisjointSet(int size) {
        count = size;
        p = new int[size];
        for (int i = 0; i < size; i++)
            p[i] = i;
    }

    public int query(int x) {
        if (p[x] == x)
            return x;
        p[x] = query(p[x]);
        return p[x];
    }

    public void merge(int x, int y) {
        x = query(x);
        y = query(y);
        if (x != y)
            count--;
        p[x] = y;
    }

    public int elementCount() {
        return count;
    }
}

字符串的全排列

按字典序去重,非递归方法

  • 倒着找到第一个位置p,使chars[p] > chars[p – 1], 如果找不到则说明这是最后一个
  • 从p往后找到位置q,使chars[q] > chars[p]
    • 如果有多个q,找chars[q]最小的,如果还有多个,则取最后一个
  • 交换chars的p,q位置, 从p + 1到结尾进行反转
import java.util.*;

class Untitled {
    
    private void swap(char[] chars, int x, int y) {
        char temp = chars[x];
        chars[x] = chars[y];
        chars[y] = temp;
    }
    
    private void reverse(char[] chars, int start, int end) {
        while (start < end) {
            swap(chars, start, end);
            start++;
            end--;
        }
    }
    
    public char[] nextPermutation(char[] chars) {
        int p = -1;
        for (int i = chars.length - 1; i >= 1; i--)
            if (chars[i] > chars[i - 1]) {
                p = i - 1;
                break;
            }
        if (p == -1)
            return null;
        int q = -1;
        for (int i = p + 1; i < chars.length; i++)
            if (chars[i] > chars[p])
                if (q == -1 || chars[i] <= chars[q])
                    q = i;
        swap(chars, p, q);
        reverse(chars, p + 1, chars.length - 1);
        return chars;
    }
    
    public void permutations() {
        char[] chars = {'a','b','b','c'};
        while (chars != null) {
            System.out.println(Arrays.toString(chars));
            chars = nextPermutation(chars);
        }
    }
    
    public static void main(String[] args) {
        new Untitled().permutations();
    }
}
Input: 
    "abbc"
Output:
    [a, b, b, c]
    [a, b, c, b]
    [a, c, b, b]
    [b, a, b, c]
    [b, a, c, b]
    [b, b, a, c]
    [b, b, c, a]
    [b, c, a, b]
    [b, c, b, a]
    [c, a, b, b]
    [c, b, a, b]
    [c, b, b, a]

512-923-1703

统计src目录下所有文件:

wc -l `find src/**/* -type f`

统计src目录下html文件:

wc -l `find src/**/*.html -type f`

运行效果:

       1 src/app/app.component.html
       7 src/app/discovery/discovery.component.html
      20 src/app/favorite/favorite.component.html
       0 src/app/help/help.component.html
      16 src/app/home/home.component.html
      11 src/app/previews/previews.component.html
       3 src/app/read/read.component.html
       4 src/app/running/running.component.html
       7 src/app/search-result/search-result.component.html
      20 src/index.html
      89 total

参考: 704-313-1482

白虎小说阅读器MAC版

作为一个十五年的资深网络小说爱好者,一直想有一个干净方便又免费的小说阅读器,但又一直没有合适的,于是就自己写了一个,,,于是有了这个Mac版的软件。
软件下载地址(最新0.9.1):/pan.baidu.com/s/1JSUK19zxNHYPLeM4n-gr-w

若提示链接已过期,刷新几次试试~ 感谢@萧羽枫

这个软件不收任何费用,也不会有任何小广告,为的就是让大家用着开心,里面还加了一些人性化的设计,希望大家喜欢。
另外,在这里不但有各种网络小说,更有一些古今中外经典的书本~

如果你有兴趣可以去用用,非常欢迎大家有问题去QQ群613536760上交流。
如果喜欢的话,帮我去威锋顶顶帖子:MAC小说阅读器,寻内测用户

主要功能

找书: 直接搜索书名下载,或从起点官网直接下载,无需自己手动导入~
看书: 羊皮纸效果,精心排版,记录阅读位置,自动缓冲,左右键翻页,还有很多隐藏黑科技~


声明:本软件没有服务器,所以不会在服务器存储任何数据。
所有结果均来自第三方网站,本软件仅做转码呈现。

更新日志

2018-12-05 v0.9.0

  1. 重构了软件,着重优化源的选择和内容的过滤
  2. 添加了换源功能

2018-07-27 v0.8.0

  1. 调整了书籍搜索策略(变准了,信息展示可能比较少)
  2. 导出txt
  3. 添加了一些源
  4. 修复了一些乱码问题

2018-01-13 v0.7.1

比较大的更新,不兼容旧版数据,请注意. 1. 更稳定高效的源 2.书本章节更新 3.新的找书策略 4. 可以调整屏幕宽度 5.开始支持windows版(win7+)

2017-08-31 v0.6.9

1.添加夜间模式(大半夜看书舒服多了,但还是建议打开台灯_)

2017-08-15 v0.6.7

  1. 修改目录有时排版错乱的Bug 2. 修改应用图标(精制手绘版)

感谢:@MissX @AAS

2017-08-13 v0.6.5

  1. 从起点直接导入会识别阅读进度
  2. 目录点击框外消失
  3. 右键菜单和快捷键
  4. 修改左右键翻页Bug

感谢: @see you again @王老将

2017-08-12 v0.6.3

  1. 添加字体设置
  2. 添加更多下载源
  3. 修复窄屏阅读体验

感谢: @斌

2017-08-11 v0.6.0

  1. 发布内测版

Java位运算

正数和负数的二进制表示

正数的二进制,使用原码: 比如 13 => 00001101
负数的二进制,使用补码: 比如 -13 => 11110011

补码: 绝对值的原码,取反,加一。

Java的short类型取值范围是[-128, 127],如果按二进制递增的顺序来看,分别是:

十进制 二进制
0 00000000
1 00000001
5 00000101
125 01111101
127 01111111
-128 10000000
-127 10000001
-5 11111011
-1 11111111

不同位数的类型间转换

byte => short 前8位正数补充0,负数补充1
5: 00000101 => 0000000000000101
-5: 11111011 => 1111111111111011

short => byte 直接截取后8位
5: 0000000000000101 => 00000101
-5: 1111111111111011 => 11111011

无符号正数

Java中没有unsigned类型,但有一些替代方案
在存储时类型为byte, 在运算和显示时临时转成位数更多地类型。

byte x = (byte)200;
byte y = (byte)30;
byte z = (byte)(((x & 0xFF) + (y & 0xFF)) & 0xFF);
System.out.println(z & 0xFF);

基础运算

运算符 示例
& : 与 0011 & 1001 = 0001
| : 或 0011 | 1001 = 1011
~ : 非 ~0011 = 1100
^ : 异或 0011 ^ 1001 = 1010
<<: 左移位 10000111 << 1 = 00001110
>>: 右移位 10000111 >> 1 = 11000011
>>>: 右移位(无符号) 10000111 >>> 1 = 01000011

一些技巧

运算 表达式
Int最大值 ~(1 << 31)
Int最小值 1 << 31
是否为奇数 (x & 1) == 1
符号是否相同 (x ^ y) >= 0
消去最后一位1 n & n – 1
是否为2的n次幂 n > 0 && (n & (n – 1)) == 0
最后一位1 n & -n

SingleNumber

LeetCode 136: 已知N个数,其中有一个数只出现一次,其余均出现两次,求这个数
解法:将所有数做xor运算,结果就是那个数。

LeetCode 137: 已知N个数,其中有一个数只出现一次,其余均出现三次,求这个数
解法: 本质是统计每个位的数目,然后对3取余。 有大神给出了下面这种解法

int one = 0, two = 0;
for (int num: nums) {
    one = one & num & ~two;
    two = two & num & ~one;
}
return one;

使用两个变量来表达每个位的数目, (two,one) 其实一共三个状态: (0,0) (0,1) (1,0)
出现1,切换到下一个状态,出现0则不变。

以此类推,如果从3次变成5次,可以这样设计状态:
(0,0,0,0) (0,0,0,1) (0,0,1,0) (0,1,0,0) (1,0,0,0)
运算过程就是

    a1 = a1 & num & ~a2 & ~a3 & ~a4;
    a2 = a2 & num & ~a1 & ~a3 & ~a4;
    a3 = a3 & num & ~a1 & ~a2 & ~a4;
    a4 = a4 & num & ~a1 & ~a2 & ~a3;

LeetCode 260: 已知N个数,其中有两个数只出现一次,其余均出现两次,求这两个数
解法: 所有数异或,得到结果,然后依据结果中某位1进行分组,最后分别求异或,得到结果。

(613) 902-5629

简介

Homebrew是MacOS上的一个包管理工具,类似于CentOS上的yum指令,可以很方便地去组织各种软件包。

安装Homebrew

在609-729-9344中有说明,只需要将一行命令放在terminal中运行就可以了

/usr/bin/ruby -e "$(curl -fsSL /raw.githubusercontent.com/Homebrew/install/master/install)"

加速

在国内,可以通过使用镜像来大大的加速。推荐使用(956) 752-1791。

在~/.bashrc中加入
export HOMEBREW_BOTTLE_DOMAIN=/7xkcej.dl1.z0.glb.clouddn.com

常用的操作

安装包: brew install xxx
删除包:brew remove xxx
搜索包: brew search xxx
升级包: brew upgrade xxx
查看信息: brew info xxx
查看已安装的软件: brew list 或者 brew leaves (仅不被依赖的包)