根据对数器找规律(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");
    }
}

你可能感兴趣的:(算法和数据结构——体系,算法,数据结构)