根据对数器找规律(3)

题目

定义一种数:可以表示成若干(数量>1)连续正数和的数。
比如:5 = 2+3, 5就是这样的数;12 = 3+4+5, 12就是这样的数;1不是这样的数,因为要求数量大于1个、连续正数和。
2 = 1 + 1,2也不是,因为等号右边不是连续正数。给定一个参数N,返回是不是可以表示成若干连续正数和的数。

对数器找规律总结
  1. 某个面试题,输入参数类型简单,并且只有一个实际参数
  2. 要求的返回值类型也简单,并且只有一个
  3. 用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code
代码
package com.harrison.class26;

/**
 * @author Harrison
 * @create 2022-04-07-18:12
 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
 */
public class Code03_MSumToN {
    // 暴力解法
    public static boolean isMSum1(int num) {
        for (int start = 1; start <= num; start++) {
            int sum = start;
            for (int j = start + 1; j <= num; j++) {
                if (sum + j > num) {
                    break;
                }
                if (sum + j == num) {
                    return true;
                }
                sum += j;
            }
        }
        return false;
    }

    // 规律解法
    public static boolean isMSum2(int num) {
        // return num == (num & (~num + 1));
        // return num==(num&(-num));
        return (num & (num-1)) !=0;
    }

    public static void main(String[] args) {
        for (int num = 1; num < 200; num++) {
            System.out.println(num + ":" + isMSum1(num));
        }
        System.out.println("test begin");
        for (int num = 1; num < 5000; num++) {
            if (isMSum1(num) != isMSum2(num)) {
                System.out.println("Oops!");
            }
        }
        System.out.println("test finish");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的Harrison

从来无所求,所得皆惊喜。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值