【Leetcode】丑数/数组排序/转置(思维提升)

丑数
就是只包含质因数 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;    }
}

说明:重点在于长度设定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值