奇怪的Math
Factorial Trailing Zero
技巧在于,每5个数会产生一个0。 为什么呢?试想1234567891011,前5个数中有一个2一个5,相乘有一个0,后5个数中有一个10,又有一个0。以此类推,每5个数会有一个0。
public class Solution {
public int trailingZeroes(int n) {
int result = 0;
while(n > 0) {
n /= 5;
result += n;
}
return result;
}
}
Minimum Moves to Equal Array Elements (BB)
Add 1 to n - 1 elements is the same as subtracting 1 from one element, w.r.t goal of making the elements in the array equal. So, best way to do this is make all the elements in the array equal to the min element.
// Add 1 to n - 1 elements is the same as subtracting 1 from one element
public class Solution {
public int minMoves(int[] nums) {
int min = Integer.MAX_VALUE;
for(int num : nums) {
min = Math.min(min, num);
}
int sum = 0;
for(int num : nums) {
sum += num - min;
}
return sum;
}
}
Grey Code
翻转,前面加1。 还带有一点位运算。
Count Prime
排除法,i * i <= n
的所有数
Multiply Strings
非常巧妙的根据最终结果的每一位来计算的方法。
31. Next Permutation
1) 先从后往前找到第一个不是依次增长的数,记录下位置p。比如例子中的3,对应的位置是1; 2) 接下来分两种情况: (1) 如果上面的数字都是依次增长的,那么说明这是最后一个排列,下一个就是第一个,其实把所有数字反转过来即可(比如(6,5,4,3,2,1)下一个是(1,2,3,4,5,6)); (2) 否则,如果p存在,从p开始往后找,找到下一个数就比p对应的数小的数字,然后两个调换位置,比如例子中的4。调换位置后得到(2,4,6,5,3,1)。最后把p之后的所有数字倒序,比如例子中得到(2,4,1,3,5,6), 这个即是要求的下一个排列。