力扣hot100做题整理91-100
1.只出现一次的数字
异或“相同为0,不同为1
class Solution {public int singleNumber(int[] nums) {// 两个相同,异或后为0int res = 0;for (int i = 0; i < nums.length; i++) {res = res ^ nums[i];}return res;}
}
2.多数元素
采用摩尔投票的方式
或者采用hash表
class Solution {public int majorityElement(int[] nums) {// 摩尔投票int res = 0;int count = 0;for (int num : nums) {if (count == 0) {res = num;}if (num == res) {count++;} else {count--;}}return res;}
}
3.颜色分类
遍历两边数组,统计
class Solution {public void sortColors(int[] nums) {int[] count = new int[3];for (int num : nums) {count[num]++;}int index = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < count[i]; j++) {nums[index++] = i;}}}
}
4.寻找重复数
直接排序找
class Solution {public int findDuplicate(int[] nums) {Arrays.sort(nums);for (int i = 0; i < nums.length-1; i++) {if(nums[i] == nums[i+1]) {return nums[i];}}return 0;}
}
5.下一个排列
1.从后往前遍历,第一个递减的排序,记录左边元素a
2.从后往前遍历,找到第一个大于记录的左边元素为b
3.交换a和b
4.a右边的元素全部逆序
class Solution {public void nextPermutation(int[] nums) {// 1.从后往前找出第一个升序对(i,j) nums[i] < nums[j] 123465 a[i] = 4 a[j] = 6int a = -1;for (int i = nums.length-1; i > 0; i--) {if (nums[i-1] < nums[i]) {a = i-1;break;}}if (a == -1) {int left = 0, right = nums.length-1;while (left <= right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}return;}// 2.从后往前找第一个比a[i]大的元素,并交换位置for (int i = nums.length-1; i >= 0; i--) {if (nums[i] > nums[a]) {int temp = nums[i];nums[i] = nums[a];nums[a] = temp;break;}}// 3.a[j]及后面的元素逆序int left = a+1, right = nums.length-1;while (left <= right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}}
}