Problem 56:数组中数字出现的次数
public void FindNumsAppearOnce(int [] arr,int num1[] , int num2[]) {
int diff = 0;
for(int num : arr)
diff ^= num;
diff &= -diff;
for(int num : arr){
if((num & diff) == 0)
num1[0] ^= num;
else
num2[0] ^= num;
}
}
Problem 57:和为s的数字
public ArrayList<Integer> FindNumbersWithSum(int [] arr,int sum) {
if(arr == null || arr.length == 0) return new ArrayList<Integer>();
int low = 0;
int high = arr.length - 1;
while(low < high){
int cur = arr[low] + arr[high];
if(cur == sum)
return new ArrayList<Integer>(Arrays.asList(arr[low], arr[high]));
else if(cur < sum)
low++;
else
high--;
}
return new ArrayList<Integer>();
}
和为s的连续正数序列
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> result = new ArrayList();
int low = 1, high = 2;
while(low < high){
int cur = (low + high) * (high - low + 1) / 2;
if(cur == sum){
ArrayList<Integer> list = new ArrayList();
for(int i = low; i <= high; i++)
list.add(i);
result.add(list);
low++;
}else if(cur < sum)
high++;
else
low++;
}
return result;
}
Problem 58:翻转字符串
public String ReverseSentence(String str) {
if(str == null || str.length() == 0) return "";
char[] chars = str.toCharArray();
reverse(chars, 0, chars.length - 1);
int blank = -1;
for(int i = 0; i < chars.length; i++){
if(chars[i] == ' '){
int nextBlank = i;
reverse(chars, blank + 1, nextBlank - 1);
blank = nextBlank;
}
}
reverse(chars, blank + 1, chars.length - 1);
return new String(chars);
}
public void reverse(char[] arr, int low, int high){
while(low < high){
char temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
low++;
high--;
}
}
左旋字符串
public String LeftRotateString(String str,int n) {
if(str == null || n > str.length()) return "";
char[] chars = str.toCharArray();
reverse(chars, 0, n - 1);
reverse(chars, n, chars.length - 1);
reverse(chars, 0, chars.length - 1);
return new String(chars);
}
public void reverse(char[] arr, int low, int high){
while(low < high){
char temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
low++;
high--;
}
}
Problem 59:队列的最大值
public ArrayList<Integer> maxInWindows(int [] num, int size){
ArrayList<Integer> result = new ArrayList();
if(num == null || num.length == 0 || size > num.length || size < 1) return result;
PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> o2 - o1);
for(int i = 0; i < size; i++)
heap.add(num[i]);
result.add(heap.peek());
for(int i = 0, j = i + size; j < num.length; i++, j++){
heap.remove(num[i]);
heap.add(num[j]);
result.add(heap.peek());
}
return result;
}
Problem 60:n个骰子的点数
public List<Map.Entry<Integer, Double>> dicesSum(int n) {
int face = 6;
int pointNum = face * n;
long[][] dp = new long[2][pointNum + 1];
for (int i = 1; i <= face; i++)
dp[0][i] = 1;
int flag = 1;
for (int i = 2; i <= n; i++, flag = 1 - flag) {
for (int j = 0; j <= pointNum; j++)
dp[flag][j] = 0;
for (int j = i; j <= pointNum; j++)
for (int k = 1; k <= face && k <= j; k++)
dp[flag][j] += dp[1 - flag][j - k];
}
double totalNum = Math.pow(6, n);
List<Map.Entry<Integer, Double>> ret = new ArrayList<>();
for (int i = n; i <= pointNum; i++)
ret.add(new AbstractMap.SimpleEntry<>(i, dp[1 - flag][i] / totalNum));
return ret;
}