Question 2 Iterator for Combination

Method 1

和刚才的题目一样

  • 只不过字母不一定连续,但是保证了顺序是递增的

总结

  • Case 1: 已经处理完所有的位置,收集solution,减1把数字++

    • 尝试把能的最后一位递增到原始given str中的下一位

  • Case 2:这个书自己超过了最大范围说明当前不合法必须回退到前一位

    • 最大范围:这三位启示最大的就是原始given str中倒叙的后K位

    • 对于查找谁是那个所谓的最高可以增大的位:倒叙遍历第一个不同的

    • 最后一位找到了,他会变大成为谁呢?

  • Case 3:顺水推舟直到所有数字都递增

    • 这一位以及这一位以后的所有字母都照搬given str

有一些浪费时间的String operation/use case

  • substring

  • indexOf

Method 2 看use case的情况:需要连续的情况下不真的连续--》 bit mask(bit operation)

bitmask: 我用一个数字代表我的选择

bit:要么0代表不选,要么1代表选(一个位置上,几个进制代表几个状态)

abcd:选与不选这些字母的问题其实就是这四位的数字里哪些是1,哪些是0

易错点

  • 最小的mask是谁?最小的size combination 0011(cd)

  • 开始的mask怎么做出来的呢?

    • ab --》 1100

  • 一开始最小的combination = (1 << totalLength) - (1 << (totalLength - combinationLength))

API logic:

  • get next maskNumber:

    • 能直接把currentmask 减1

      • 1100(ab) - 1 = 1011(acd)

      • 1011(acd) - 1= 1010(ac)

    • 算法:逐次减1,直到得到hamming weight 和combinationLength一样的第一个mask

  • 如何对应上Mask和String:bitGetter 把对应位是1的位填补位originalStr中对应character对于第i个index,是否要把它加到现在的current result里

    • (currentMask & (1 << n - 1 - i))!= 0

Side Problem 1: Number of 1Bits

Method 1: Java Library:

  • return Integer.bitCount(n);

Method 2: 自己实现

Method 3:技巧

竞赛技巧: n& (n - 1)是什么意思

  • 把n的二进制表示中最低的上的1改成0

  • example

    • n = 0b10100, n-1 = 0b10011

    • n & n-1 = 0b10000

  • example: 判断一个数字是不是2的幂次方

    • return n > 0 && (n & (n - 1) == 0)

Side Problem 2: Hamming Distance

本质上就是异或之后的数字中的hamming weight是多少

Last updated