参考了很多大佬的题解,仅作为自己学习笔记用。
21. 调整数组顺序使奇数位于偶数前面
题意:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
题解:
双指针,i 从左向右找偶数,j 从右向左找奇数。
public int[] exchange(int[] nums) {
int i = 0, j = nums.length - 1, tmp;
while(i < j) {
while(i < j && (nums[i] & 1) == 1) i++; // 是奇数就往后找,找偶数
while(i < j && (nums[j] & 1) == 0) j--; // 是偶数就往后找,找奇数
tmp = nums[i]; // 交换
nums[i] = nums[j];
nums[j] = tmp;
}
return nums;
}
45. 把数组排成最小的数
题意:
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
题解:
自定义排序。
若拼接字符串 x + y > y + x,则 x “大于” y ;
反之,若 x + y < y + x,则 x “小于” yy;
public String minNumber(int[] nums) {
String[] strs = new String[nums.length];
for(int i = 0; i < nums.length; i++)
strs[i] = String.valueOf(nums[i]); // 数字转 string
Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x)); // 指定排序规则
StringBuilder res = new StringBuilder();
for(String s : strs)
res.append(s);
return res.toString();
}
51. 数组中的逆序对
题意:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
题解:
归并排序。
public class Solution {
public int reversePairs(int[] nums) {
int len = nums.length;
if (len < 2)
return 0;
int[] copy = new int[len];
for (int i = 0; i < len; i++) {
copy[i] = nums[i];
}
int[] temp = new int[len]; // 辅助数组
return reversePairs(copy, 0, len - 1, temp);
}
private int reversePairs(int[] nums, int left, int right, int[] temp) {
if (left == right)
return 0;
int mid = left + (right - left) / 2;
int leftPairs = reversePairs(nums, left, mid, temp);
int rightPairs = reversePairs(nums, mid + 1, right, temp);
if (nums[mid] <= nums[mid + 1])
return leftPairs + rightPairs;
int crossPairs = mergeAndCount(nums, left, mid, right, temp);
return leftPairs + rightPairs + crossPairs;
}
// 归并,先复制到辅助数组,再将 temp 归并到 nums
private int mergeAndCount(int[] nums, int left, int mid, int right, int[] temp) {
for (int i = left; i <= right; i++) {
temp[i] = nums[i];
}
int i = left;
int j = mid + 1;
int count = 0;
for (int k = left; k <= right; k++) {
if (i > mid) {
nums[k] = temp[j++];
} else if (j > right) {
nums[k] = temp[i++];
} else if (temp[i] <= temp[j]) {
nums[k] = temp[i++];
} else {
nums[k] = temp[j++];
count += mid - i + 1;
}
}
return count;
}
}