Tips
整数和 SUM(1,n)= n+ n-1 + n-2 ... 1;
SUM(1,n) = n (n+1) /2 SUM(m,n) = SUM(1,n) - SUM(1, m-1) = n(n+1)/2 - m*(m-1)/2
排序和组合
P(n, r) 从n个物品中取r 个物品的排序 , 排列可以是先取组合,然后进行一次r的全排列。
P(n, r) = C(n,r) * r! =n*(n-1)...(n-r+1) = n! /(n-r)!
C(n,r) 从n个物品中取r 个物品的组合
C(n, r) = P(n, r) / r! = n! / (n-r)! * r!
C(n, r) = C(n, n-r);
http://chowkafat.net/Enumeration2.html
数组反序
public void reverse(int[] nums, int l, int h){
while(l<h){
swap(nums, l++, h--);
}
}
字符串反序
public void reverse(char[] s, int i, int j){
while(i<j){
char temp = s[i];
s[i]=s[j];
s[j]=temp;
i++;
j--;
}
}
等同于
StringBuffer(str).reverse();
整数反序
public int reverse(int x) {
if(x == 0)
return x;
long rev = 0;
while(x != 0){
rev = rev * 10 + x % 10;
x = x / 10;
if( rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE)
return 0;
}
return (int)rev;
}
构造回文 Palindrome
public long createPalindrome(int num){
String value = num + new StringBuilder(Long.toString(num)).reverse().toString();
return Long.parseLong(value);
}
判断回文1
// right = left or right = left + 1
private void extendPalindrome(String s, int left, int right) {
// 判断左右扩展的字符是不是回文
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
if (maxLen < right - left - 1) {
lo = left + 1;
maxLen = right - left - 1;
}
}
判断回文2
private boolean isPalindrome(String s) {
if (s == null || s.length() == 0) return false;
int lo = 0, hi = s.length() - 1;
while (lo < hi) {
if (s.charAt(lo) != s.charAt(hi)) return false;
lo++;
hi--;
}
return true;
}
Last updated
Was this helpful?