丑数
就是只包含质因数 2、3 和 5 的 正 整数。
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例 2:
输入:n = 1
输出:true
解释:1 没有质因数。
示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
代码1
独立循环
class Solution {
public boolean isUgly(int n) { if (n <= 0) return false; // 排除无效输入
while (n % 2 == 0) n /= 2;
while (n % 3 == 0) n /= 3;
while (n % 5 == 0) n /= 5;
return n == 1; }
}
代码2
利用增强for循环
class Solution {
public boolean isUgly(int n) {
if (n <= 0) {
return false;
}
int[] factors = {2, 3, 5};
for (int factor : factors) {
while (n % factor == 0) {
n /= factor;
}
}
return n == 1;
}
}
代码3
利用位运算,见上篇2的幂运算。
class Solution {
public boolean isUgly(int n) {
if (n <= 0) {
return false;
}
while (n % 3 == 0) {
n /= 3; }
while (n % 5 == 0) {
n /= 5; }
return (n & (n - 1)) == 0; }
}
1.首先,如果n≤0,不符合题目正整数的要求,返回
false。
2.去掉n 中的因子 3,也就是不断把 n除以3,直到n不是3的倍数为止。
3.去掉中的因子 5,也就是不断把 n 除以5,直到n不是5的倍数为止。
4.最后,n 必须只剩下因子 2,即n=2k。
数组
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。
请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。
示例 1:
输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7]
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]
示例 2:
输入:nums = [1,2,3,4,4,3,2,1], n = 4
输出:[1,4,2,3,3,2,4,1]
示例 3:
输入:nums = [1,1,2,2], n = 2
输出:[1,2,1,2]
常见错误代码问题分析
class Solution {
public int[] shuffle(int[] nums, int n) {
for(int i=0;i<2*n;i++){ for(int j=0;j<n;j++){ for(int k=n-1;k<2*n;k++){ nums[i]=nums[j]; nums[i+1]=nums[k];
}
}
}
return nums; }
}
说明:每次赋值会覆盖原来的值,应该定义新的数组排序。使三层循环无意义。
代码示例1
利用双指针
class Solution {
public int[] shuffle(int[] nums, int n) {
int[] res = new int[2 * n]; // 创建结果数组
int a = 0, b = n; // 前n个元素指针a,后n个元素指针b
for (int i = 0; i < 2 * n; i += 2) {
res[i] = nums[a++]; // 放入前半部分元素
res[i + 1] = nums[b++]; // 放入后半部分元素
}
return res;
}
}
说明:
要使用i+=2,确保赋值正确。
代码示例2
一次遍历填充,以数组为基准。
class Solution {
public int[] shuffle(int[] nums, int n) {
int[] ans = new int[2 * n];
for (int i = 0; i < n; i++) {
ans[2 * i] = nums[i];
ans[2 * i + 1] = nums[i + n];
}
return ans;
}
}
说明:
将原数组按偶数位,奇数位填充。
矩阵转置
给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。
矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]
示例 2:输入:matrix = [[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]
class Solution {
public int[][] transpose(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] ans = new int[n][m];
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { ans[j][i] = matrix[i][j];
}
} return ans; }
}
说明:重点在于长度设定。