[leetcode] (周赛)869. 重新排序得到 2 的幂
枚举排列,然后验证。比较暴力。
其实好一点的做法应该反过来,先把int范围下的2的N幂算出来,然后一个一个验证给出的数能不能拼成。
class Solution {
    public Integer[] nextPermutation(Integer[] nums) {
        if (nums.length == 1) {
            return new Integer[]{};
        }
        int p = -1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] < nums[i + 1]) {
                p = i;
                break;
            }
        }
        if (p != -1) {
            int tmp = nums[p];
            int q = nums.length - 1;
            while (nums[q] <= tmp) {
                q--;
            }
            nums[p] = nums[q];
            nums[q] = tmp;
            reverse(p + 1, nums);
        } else {
            return new Integer[]{};
        }
        return nums;
    }
    public void reverse(int k, Integer[] nums) {
        if (k >= nums.length) return;
        int i = k;
        int j = nums.length - 1;
        while (i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }
    public boolean reorderedPowerOf2(int N) {
        if (N == 0) {
            return false;
        }
        String s = Integer.toString(N);
        int[] p = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
        for (int i = 0; i < s.length(); i++) {
            p[s.charAt(i) - '0']++;
        }
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < p[i]; j++) {
                list.add(i);
            }
        }
        Integer[] nums = list.stream().toArray(Integer[]::new);
        StringBuilder origin = new StringBuilder();
        for (int i = 0; i < nums.length; i++) {
            origin.append(nums[i]);
        }
        while (nums[0] == 0) {
            nums = nextPermutation(nums);
        }
        int flag = 0;
        while (true) {
            if (nums.length == 0) {
                break;
            }
            StringBuilder st = new StringBuilder();
            for (int i = 0; i < nums.length; i++) {
                st.append(nums[i]);
            }
            Integer num = Integer.valueOf(st.toString());
            double ans = Math.log(num) / Math.log(2);
            if (isNotDouble(ans)) {
                return true;
            }
            nums = nextPermutation(nums);
        }
        return false;
    }
    public static boolean isNotDouble(Double x) {
        int i = x.intValue();
        return x - i < 0.000001;
    }
}
这周周赛就做出来这两个。。。水平还是太低啊,哎
[leetcode] (周赛)869. 重新排序得到 2 的幂的更多相关文章
- Leetcode 869. 重新排序得到 2 的幂
		
869. 重新排序得到 2 的幂 显示英文描述 我的提交返回竞赛 用户通过次数102 用户尝试次数134 通过次数103 提交次数296 题目难度Medium 从正整数 N 开始,我们按任何顺序 ...
 - Leetcode(869)-重新排序得到 2 的幂
		
从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零. 如果我们可以通过上述方式得到 2 的幂,返回 true:否则,返回 false. 示例 1: 输入:1 输出 ...
 - [Swift]LeetCode869. 重新排序得到 2 的幂 | Reordered Power of 2
		
Starting with a positive integer N, we reorder the digits in any order (including the original order ...
 - 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)
		
Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...
 - LeetCode 50 Pow(x, n) (实现幂运算)
		
题目链接:https://leetcode.com/problems/powx-n/?tab=Description Problem:实现幂运算即 pow(x,n) 设形式为pow(x,n) ...
 - 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
		
Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...
 - 【LeetCode】869. Reordered Power of 2 解题报告(Python & C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计每位数字出现的次数 日期 题目地址:http ...
 - leetcode刷题笔记231 2的幂
		
题目描述: 给定一个整数,写一个函数来判断它是否是2的幂. 题目分析: 判断一个整数是不是2的幂,可根据二进制来分析.2的幂如2,4,8,等有一个特点: 二进制数首位为1,其他位为0,如2为10,4为 ...
 - leetcode刷题笔记342 4的幂
		
题目描述: 给定一个整数 (32位有符整数型),请写出一个函数来检验它是否是4的幂. 示例:当 num = 16 时 ,返回 true . 当 num = 5时,返回 false. 问题进阶:你能不使 ...
 
随机推荐
- Insertion Sort and Merge Sort
			
Insertion Sort(插入排序) 思路:for 循环遍历数组中的每一个数 用while将每次遍历到的数于左侧的数进行对比,将小的排到左边 void InsertionSort(int*A, i ...
 - 浅谈 C# Assembly 与 IL (一):C# Assembly 与 Reflection
			
作者:Compasslg 前言 前一阵子想利用闲余时间写一个 Unity 游戏的翻译工具,主要是用于翻译一些内嵌在代码中的文本,最初想偷懒看了一下网上的教学推荐说可以先利用DnSpy.ILSpy等工具 ...
 - JMeter 结果处理常见问题
			
1. 前言 2. 结果处理常见问题 1)在察看结果树中只看失败情况 2)如何把日志放入文件查看 3)cvs 文件中文读取乱码 4)失败请求数据的采集 5)结果树响应数据中文乱码解决办法 1. 前言 工 ...
 - HUAWEI防火墙双出口据链路带宽负载分担
			
组网图形 组网需求 通过配置根据链路带宽负载分担,使流量按照带宽的比例分担到各链路上,保证带宽资源得到充分利用. 如图1所示,企业分别从ISP1和ISP2租用了一条链路,ISP1链路的带宽为100M, ...
 - G - River Hopscotch(二分)
			
Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully ...
 - 逆向工程第003篇:跨越CM4验证机制的鸿沟(上)
			
一.前言 <冠军足球经理>系列作为一款拟真度极高的足球经营类游戏,赢得过无数赞誉,而CM4可以说是这个传奇的起点.但是在游戏安装过程中,当用户输入完序列号之后,程序并不会对用户的输入进行真 ...
 - 将Android源码导入eclipse中的方法以及编译Android源码指定模块
			
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53365659 将android源码导入eclipse.androidstudio. ...
 - layui中时间插件laydate的使用
			
1.加载layui.js 2.html部分 <div class="layui-inline"> <label class="layui-form-la ...
 - Docker镜像讲解
			
Docker镜像讲解 镜像是什么 镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件做需要的所有的内容,包括代码,运行时,库,环境变量和配置文件. ...
 - python介绍,计算机核心基础,与运行程序有关的三大核心硬件,操作系统
			
python介绍,计算机核心基础,与运行程序有关的三大核心硬件,操作系统 引子 python是什么? 什么是编程语言?为何要有编程语言? 什么是编程?什么是程序?什么是进程?为何要编程? 计算机基础 ...