根据二进制下1的数目排序--LeetCode

简介: 根据二进制下1的数目排序--LeetCode

上周广联达笔试的时候,有一道题是我之前在LeetCode上见过的题,但是我在考试过程中只记得大体思路,是调用了一个C++的库函数,可以直接计算1的数量,具体调用哪个库函数记不清楚了。于是下来又搜索了一下这道题,然后回顾了一下实现思路,顺便学习一下其他方法。

题目描述:
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits

题解1:C++系统库函数

使用这个__builtin_popcount函数可以直接传一个整形数据,然后计算出1的个数。

题解2:手动计算数据中含1的个数,进行排序

//全局变量储存数据
int Bit[0x10000] = { 0 };
int Get_1_From_Int(int x)
{
  int Sum = 0;
  while (x)
  {
    //统计一个数字中1的数量
    Sum += x & 1;
    //每次向右移一位
    x >>= 1;
  }
  //总共1的个数  
  return Sum;
}
vector<int> SortByBits(vector<int>& Arr) 
{
    //C+11新特性,新for循环
  for (auto x : Arr)
  {
    Bit[x] = Get_1_From_Int(x);
  }
  //使用Lambda函数内嵌,相当于函数指针的作用
  sort(Arr.begin(), Arr.end(), [&](int x, int y)
  {
    return Bit[x] == Bit[y] ? x < y : Bit[x] < Bit[y];
  });
  return Arr;
}
void main()
{
  setlocale(LC_ALL, "chs");//识别中文
  vector<int> v1;
  v1.push_back(5);
  v1.push_back(6);
  v1.push_back(7);
  v1.push_back(8);
  v1.push_back(9);
  v1.push_back(1);
  v1.push_back(2);
  vector<int> v5;
  v5 = SortByBits(v1);
  getchar();
  /*
  给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
  */
  getchar();
}

题解参考:

https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/solution/gen-ju-shu-zi-er-jin-zhi-xia-1-de-shu-mu-pai-xu-by/


“No sky too high,no sea too rough,no muff too tough.”


目录
相关文章
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
24 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
25 0
Leetcode第三十三题(搜索旋转排序数组)
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
算法 Java
LeetCode第67题二进制求和
这篇文章是关于LeetCode第67题二进制求和的解题思路和代码实现的分享。作者通过分析题目要求和二进制加法的规则,提供了一个Java语言的解决方案,并在最后总结了二进制在算法中的重要性。
LeetCode第67题二进制求和
|
4月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
48 0
|
4月前
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
69 0
|
6月前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
40 1
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
6月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)
【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)