2022. 将一维数组转变成二维数组/507. 完美数/1037. 有效的回旋镖

又到了喜闻乐见的新年flag时间,今年众多的flag之一就是每天在CSDN上记录刷题过程(至少也得每天一道吧,不能再拉了),希望能坚持下去。

先来看看每日一题,嗯,简单题是吧,必拿捏!
思路:

模拟存储过程
1.首先排除不能转变为二维数组的情况,返回空二维数组。
2.双层for循环,遍历m x n 二维数组的每一个位置,存入original数组count位置上的值,并使count++。

代码:

class Solution {
    public int[][] construct2DArray(int[] original, int m, int n) {
        if (original.length != m * n){return new int[0][0];}
        int[][] ans = new int[m][n];
        int count = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ans[i][j] = original[count++];
            }
        }
        return ans;
    }
}


作者:skull-m
链接:https://leetcode-cn.com/problems/convert-1d-array-into-2d-array/solution/yuan-dan-kuai-le-by-skull-m-54cp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本来我是直接暴力搜索的,但这样执行时间也太长了好家伙,去看了答案了解到因数是成对出现的,只遍历前一半的就行了,其实我一开始想到了,但一时想不起来怎么只找前一半了,菜鸡还是需要多练习呀。

思路:

1.把特殊情况排除掉,这里只用排除1就行,不过刚好前5个都是false,我就直接全筛掉了。
2.定义sum表示因子和,初值为1,因为计算因子的时候1是算的,但是num本身不能计算,所以第一对儿因子就只能让它们分手了。
3.left表示一对儿因数中较小的那位(数轴靠左),初值为2。
4.当left的平方>=num时,此时成对的因子较小的已全部遍历过,而较大的可以直接用num/left表示累加至sum中,此时可以结束循环了。

代码:

class Solution {
    public boolean checkPerfectNumber(int num) {
        if(num <= 5){return false;}
        int sum = 1;
        int left = 2;
        while (left * left < num){
            if (num % left == 0){
                sum += left;
                if (left * left < num){
                    sum +=  num / left;
                }
            }
            left++;
        }
        return sum == num;
    }
}


本来写出100%还挺开心的,结果看了评论区发现自己写的像个呆比。
思路:

思路很简单就是判断任意两点组成的斜率是不是相等,不等就复合题意,相等就返回false。

代码:

class Solution {
    public boolean isBoomerang(int[][] points) {
        return (points[2][1]-points[1][1]) * (points[0][0]-points[1][0]) != (points[0][1]-points[1][1]) * (points[2][0]-points[1][0]);
    }
}
class Solution {
    public boolean isBoomerang(int[][] points) {
        if ((points[0][0] == points[1][0] && points[0][1] == points[1][1]) ||
                (points[1][0] == points[2][0] && points[1][1] == points[2][1]) ||
                (points[2][0] == points[0][0] && points[2][1] == points[0][1])){
            return false;
        }
        if (points[0][0] == points[1][0]){
            return points[2][0] != points[0][0];
        }
        if ((points[2][0] == points[0][0]) || (points[2][0] == points[1][0])){
            return true;
        }
        double[] cnt = new double[3];
        cnt[0] = (points[0][1]-points[1][1]) * 0.01 / (points[0][0]-points[1][0]);
        cnt[1] = (points[1][1]-points[2][1]) * 0.01 / (points[1][0]-points[2][0]);
        if (cnt[0] == cnt[1]){
            return false;
        }
        cnt[2] = (points[2][1]-points[0][1]) * 0.01 / (points[2][0]-points[0][0]);
        return cnt[0] != cnt[2] && cnt[1] != cnt[2];
    }
}

第一段为根据评论区思路的代码,第二段为我的笨比代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值