首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >求与给定整数具有相同二进制权的最小+v整数大于给定数的算法

求与给定整数具有相同二进制权的最小+v整数大于给定数的算法
EN

Stack Overflow用户
提问于 2018-04-27 04:38:14
回答 3查看 427关注 0票数 2

一个正整数的二进制权是它的二进制表示中的1的数。例如,十进制数1的二进制权重为1,而十进制数7(二进制数为111 )的二进制权重为3。

给定一个正整数N,找出大于N的最小整数,它具有与N相同的二进制权重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int compute(int number)   {
    int  count = 0, nextNumber;
    char[] arr =  Integer.toBinaryString(number).toCharArray();
    for(int i =0 ; i < arr.length ;++i) {
        if(arr[i] == '1')
            ++count;
    }
    nextNumber = findNextNumber(number,count);
    return nextNumber;
}
public static int findNextNumber(int number, int weight) {
    char[] arr;
    boolean flag = true;
    int count;
    while (flag) {
        // increment number and convert it into char array
        arr = Integer.toBinaryString(++number).toCharArray();
        count = 0;
        for(int i =0 ; i < arr.length; ++i) {
            if(arr[i] == '1')
                ++count;
        }
        if(count == weight) {
            flag = false;
        }
    }

    return number;
}

我的解决方案工作得很好,但它的复杂性似乎是O(NlogN).Can --这是通过其他方法在O(N)或O(NlogN)中实现的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-29 02:43:18

这一行动有时被称为“斯诺布”。这是一个黑客快乐书中的一堆方法。最好的方法可能是使用Integer.numberOfTrailingZeros,它可能编译成硬件指令(未经测试):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int snoob1(int x) {
   int smallest, ripple, ones;  // x = xxx0 1111 0000
   smallest = x & -x;           //     0000 0001 0000
   ripple = x + smallest;       //     xxx1 0000 0000
   ones = x ^ ripple;           //     0001 1111 0000
   ones = ones >>> (2 + Integer.numberOfTrailingZeros(x)); //     0000 0000 0111
   return ripple | ones;        //     xxx1 0000 0111
}

( "2+“部分也可能存在溢出问题,因为Java计数是模32)

票数 1
EN

Stack Overflow用户

发布于 2018-04-27 04:50:17

您可以为下一个字典排列使用算法。来自这里的整数数组的Java实现。只需将其调整为使用位而不是数组项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boolean nextPermutation(int[] array) {
    // Find longest non-increasing suffix
    int i = array.length - 1;
    while (i > 0 && array[i - 1] >= array[i])
        i--;
    // Now i is the head index of the suffix

    // Are we at the last permutation already?
    if (i <= 0)
        return false;

    // Let array[i - 1] be the pivot
    // Find rightmost element that exceeds the pivot
    int j = array.length - 1;
    while (array[j] <= array[i - 1])
        j--;
    // Now the value array[j] will become the new pivot
    // Assertion: j >= i

    // Swap the pivot with j
    int temp = array[i - 1];
    array[i - 1] = array[j];
    array[j] = temp;

    // Reverse the suffix
    j = array.length - 1;
    while (i < j) {
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;
        i++;
        j--;
    }

    // Successfully computed the next permutation
    return true;
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-27 12:26:56

提出了一种在O(log )复杂度上实现相同的方法。

主要步骤:-

  1. 将一个数字转换为二进制字符数组。(非常简单)。
  2. 根据二进制数组的模式对其进行分类。(注释中解释)
  3. 根据类别调整二进制数组的0和1。
  4. 将二进制字符数组转换回数字。

代码:-

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int compute(int number)   {
    int bitPatternCategory , result;
    char[] charArr = Integer.toBinaryString(number).toCharArray();
    bitPatternCategory = determineNumberType(charArr);
    result = findNextDesired(bitPatternCategory, charArr);
    return result;
}
public static int findNextDesired(int bitPatternCategory, char[] arr) {
    int number;
    //System.out.print("bitPatternCategory\t"+bitPatternCategory+"\n");
    char[] temp = new char[arr.length + 1];
    if (bitPatternCategory == 0) {
        temp = getNextForCat0(arr, temp);
    } else if (bitPatternCategory == 1) {
        temp = getNextForCat1(arr, temp);
    } else {
        temp = getNextForCat2(arr);
    }
    number = Integer.parseInt(String.valueOf(temp),2);
    return number;
}

private static char[] getNextForCat2(char[] arr) {
    // for all cases except cat 0 and 1, for example 110011000,  1001, 1101010
    //  Find first occurrence of 0 after 1 starting from RHS, exchange these bits and then move
    // all remaining 1's(on RHS to the exchanged bits) to RHS of the array
    int j =0,counterForOnes = 0;
    boolean flag = false;
    for (int i = arr.length - 1; i >= 0; --i) {
        if ((arr[i] == '1') && (flag == false)) {
            flag = true;
        } else if ((arr[i] == '0') && (flag == true)) {
            char tempChar = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = tempChar;
            j = i+2;
            break;
        }
    }
    while((j < arr.length) && (arr[j]!='0'))    {
        arr[j] = '0';
        ++counterForOnes;
        ++j;
    }
    while(counterForOnes > 0) {
        arr[arr.length-counterForOnes]= '1';
        counterForOnes--;
    }
    return arr;
}

private static char[] getNextForCat1(char[] arr, char[] temp) {
    // for cases when all ones are on LHS for eg 11100, then add a new bit with value 1 and
    //  shift remaining 1's start from 2nd 1 towards RHS, so 1111 become 10111
    int j = 1,counterForOnes= 0;
    while((j < arr.length) && (arr[j]!='0'))    {
        arr[j] = '0';
        ++counterForOnes;
        ++j;
    }
    for (int i = 0; i < arr.length; ++i) {
        temp[i] = arr[i];
    }
    temp[temp.length-1] = '0';
    while(counterForOnes > 0) {
        temp[temp.length-counterForOnes]= '1';
        counterForOnes--;
    }
    arr = temp;
    return arr;
}

private static char[] getNextForCat0(char[] arr, char[] temp) {
    // for cases when all bits are ones only, then add a new bit with value 1 and
    //  shift remaining 1's start from 2nd 1 towards RHS, so 1111 become 10111
    for (int i = 0; i < arr.length; ++i) {
        temp[i] = arr[i];
    }
    for (int i = temp.length - 1; i >= 1; --i)
        temp[i] = temp[i - 1];
    temp[1] = '0';
    arr = temp;
    return arr;
}

public static int determineNumberType(char[] arr)   {
    int stateMachine = 0;   //Category 0 for all ones for eg 111, 1111
                            //Category 1 for ones and zeroes  11100, 110000
                            //Category 2 for mix ones or we can say remaining combinations 1011, 11101
    // Assuming MSB will always be 1
    char temp = arr[0];
    for(int i = 0 ; i < arr.length ; ++i)   {
        if((temp == arr[i]) && (stateMachine == 0)) {
            stateMachine = 0;
        } else if(((temp != arr[i])) && (stateMachine == 0))    {
            stateMachine = 1;
            temp = arr[i];
        }else if(((temp == arr[i])) && (stateMachine == 1)) {
            stateMachine = 1;
        }else if(((temp != arr[i])) && (stateMachine == 1)) {
            stateMachine = 2;
            //temp = arr[i];
            break;
        }
    }   
    return stateMachine;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50062582

复制
相关文章
回溯算法: 求给定数组的全排列
全排列: {[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]}
一个架构师
2022/06/20
4160
回溯算法: 求给定数组的全排列
python:求整数的二进制表示
运行结果: C:\Users\suneee\AppData\Local\Programs\Python\Python36\python.exe E:/wangjz/PyWorkSpace/LearnPython/int2bin.py 0b1010101010101010101010 0b1010101010101010101010 Process finished with exit code 0
未来sky
2018/08/30
1.4K0
求大于n的最小质数
hash取模运算时选取比较大的质数,就可以有效减少冲突。 有定理,一个数如果不能被2到它的平方根的所有数整除,它就是质数。
Michael阿明
2021/02/20
1.2K0
LeetCode 1663. 具有给定数值的最小字符串(贪心)
小写字符 的 数值 是它在字母表中的位置(从 1 开始),因此 a 的数值为 1 ,b 的数值为 2 ,c 的数值为 3 ,以此类推。
Michael阿明
2021/02/19
6710
最小正整数
Original Link 思想: 最大公约数和最小公倍数。 要求构造出的数末尾包含 k 个 0,且可以被 n 整除的最小整数; 则构造出的数必然也可以被 10^k 整除,满足同时被 n 和 10^k 整除, 显然,该数为 n 和 10^k 的最小公倍数时即可满足条件。 求最小公倍数即为 n \times 10^k \div \gcd(n, 10^k)。 代码: #include <bits/stdc++.h> using namespace std; typedef long long LL; LL
浪漫主义狗
2023/02/24
1.9K0
算法创作|求任意N个整数中的最大值和最小值
解决这个问题有三种常见思路,第一种思路比较简单粗暴,就是对用户输入的每个整数两两之间进行比较,直到找到最大的整数和最小的整数为止。第二种思路是将用户输入的整数放入一个空列表中,然后利用Python内置的max()函数和min()函数分别得到最大值和最小值。第三种思路与第二种思路类似,也是将用户输入的整数放入一个空列表,然后对列表进行排序,列表下标为0的数即为最小值,列表下标为N-1的数即为最大值。接下来让我们来演示一下第三种方法:
算法与编程之美
2021/03/30
2.3K0
算法创作|求任意N个整数中的最大值和最小值
Python组合列表中多个整数得到最小整数(一个算法的巧妙实现)
'''程序功能: 给定一个含有多个整数的列表,将这些整数任意组合和连接, 返回能得到的最小值。 代码思路: 将这些整数变为相同长度(按最大的进行统一),短的右侧使用个位数补齐 然后将这些新的数字升序排列,将低位补齐的数字删掉, 把剩下的数字连接起来,即可得到满足要求的数字''' def mergeMinValue(lst): # 生成字符串列表 lst = list(map(str, lst)) # 最长的数字长度 m = len(max(lst, k
Python小屋屋主
2018/04/17
2.8K0
Python组合列表中多个整数得到最小整数(一个算法的巧妙实现)
LeetCode 5997. 找到和为给定整数的三个连续整数
给你一个整数 num ,请你返回三个连续的整数,它们的 和 为 num 。 如果 num 无法被表示成三个连续整数的和,请你返回一个 空 数组。
Michael阿明
2022/03/10
9180
华为OD机试 求字符串中所有整数的最小和
求字符串中所有整数的最小和 💰 题目 📖 说明 📝 字符串 s,只包含 a-z A-Z + - ; 合法的整数包括 1) 正整数 一个或者多个0-9组成,如 0 2 3 002 102 2)负整数 负号 - 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023 输入 📥 包含数字的字符串 输出 📤 所有整数的最小和 💰 题解参考 JS 题解:https://blog.csdn.net/hihell/article/details/129107657 C++题解:https://b
梦想橡皮擦
2023/03/13
4760
Q1663 具有给定数值的最小字符串(Smallest String With A Given Numeric Value)
  leetcode 中等难度中比较简单的一个,题目描述点击这里。读完描述可将本题精简为如下内容:
用户2038589
2022/05/11
3010
2022-01-30:最小好进制。 对于给定的整数 n, 如果n的k(k
对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。
福大大架构师每日一题
2022/01/30
1850
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n =
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。
福大大架构师每日一题
2023/07/25
2480
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n =
算法-数组形式的整数加法
版权声明: https://blog.csdn.net/li_xunhuan/article/details/90200722
Fisherman渔夫
2019/07/31
5020
给定一个罗马数字,将其转换成整数_计算并输出给定整数n的所有因子
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。 但也存在特例,例如 4 不写做 IIII,而是 IV。 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。 同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
全栈程序员站长
2022/11/10
4810
【题解】Secret Message G
信息是二进制的,共有 M(1 \le M \le 50000)条,反间谍能力很强的约翰已经部分拦截了这些信息,知道了第 i 条二进制信息的前 b_i(1 \le b_i \le 10000)位,他同时知道,奶牛使用 N(1 \le N \le 50000)条暗号.但是,他仅仅知道第 j 条暗号的前 c_j(1 \le c_j \le 10000)位。
MikeC
2022/09/21
4600
Shopee 一面算法题:颠倒给定的 32 位无符号整数
输出:964176192 (00111001011110000010100101000000)
恋喵大鲤鱼
2022/06/29
5120
LeetCode 1237. 找出给定方程的正整数解
给出一个函数 f(x, y) 和一个目标结果 z,请你计算方程 f(x,y) == z 所有可能的正整数 数对 x 和 y。
Michael阿明
2020/07/13
5110
LeetCode 1237. 找出给定方程的正整数解
漫画算法:找出缺失的整数
题目:一个无序数组里有99个不重复正整数,范围从1到100,唯独缺少一个整数。如何找出这个缺失的整数?
小灰
2022/07/05
2920
漫画算法:找出缺失的整数
LeetCode 1015. 可被 K 整除的最小整数(数学)
1. 题目 给定正整数 K,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。 返回 N 的长度。如果不存在这样的 N,就返回 -1。 示例 1: 输入:1 输出:1 解释:最小的答案是 N = 1,其长度为 1。 示例 2: 输入:2 输出:-1 解释:不存在可被 2 整除的正整数 N 。 示例 3: 输入:3 输出:3 解释:最小的答案是 N = 111,其长度为 3。 提示: 1 <= K <= 10^5 来源:力扣(LeetCode) 链接:https://leetcode-
Michael阿明
2020/07/13
9400
Python 的整数
就返回了所输入的数字,这说明 Python 解释器接受了所输入的那个数字,并且认识了它。
老齐
2021/09/15
2K0

相似问题

求整数数组中给定数的最小和集

11

用给定整数交换一对数字求最小整数的算法

73

有效地找到大于给定整数的最小“稳定数”

30

输出大于Prolog中给定数的整数

11

求最小整数

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文