(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

news2024/11/27 8:23:03

❓ 1356. 根据数字二进制下 1 的数目排序

难度:简单

给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

示例 1:

输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 0 个 1 的数。
[1,2,4,8] 都有 1 个 1 。
[3,5,6] 有 2 个 1 。
[7] 有 3 个 1 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]

示例 2:

输入:arr = [1024,512,256,128,64,32,16,8,4,2,1]
输出:[1,2,4,8,16,32,64,128,256,512,1024]
解释:数组中所有整数二进制下都只有 1 个 1 ,所以你需要按照数值大小将它们排序。

示例 3:

输入:arr = [10000,10000]
输出:[10000,10000]

示例 4:

输入:arr = [2,3,5,7,11,13,17,19]
输出:[2,3,5,17,7,11,13,19]

示例 5:

输入:arr = [10,100,1000,10000]
输出:[10,100,10000,1000]

提示

  • 1 < = a r r . l e n g t h < = 500 1 <= arr.length <= 500 1<=arr.length<=500
  • 0 < = a r r [ i ] < = 1 0 4 0 <= arr[i] <= 10^4 0<=arr[i]<=104

💡思路:位运算

对位运算基本操作还不太懂的小伙伴可以看我另一篇博客:一篇文章搞懂位运算!!!

法一:仿函数 + 位运算

  • 使用位运算,去除最低的那一位 1,来统计 1 的个数;
  • 然后根据仿函数的定义,重新定义比较函数 4cmp;
  • 最后使用 sort 函数重新排序,并使用我们自己定义的比较函数。

法二:数学 + 位运算

  • 由题目提示, 0 < = a r r [ i ] < = 1 0 4 0 <= arr[i] <= 10^4 0<=arr[i]<=104,所以 arr[i] 二进制1不超过 14个,占十进制中的两位;且先比较二进制中 1 的个数,所以个数可以占高位,乘以 100000;

  • 若1 的个数相同,则比较 arr[i],即最后再加上 arr[i];

  • 然后用 sort 进行排序,最后再取余,即为答案;

🍁代码:(C++、Java)

法一:仿函数 + 位运算
C++

class Solution {
private:
    static int bitCount(int num){
        int count = 0;
        while(num > 0){
            num &= (num - 1);
            count++;
        }
        return count;
    }
    static bool cmp(int a, int b){
        int bitA = bitCount(a);
        int bitB = bitCount(b);
        if(bitA == bitB) return a < b;
        return bitA < bitB;
    }
public:
    vector<int> sortByBits(vector<int>& arr) {
        sort(arr.begin(), arr.end(), cmp);
        return arr;
    }
};

法二:数学 + 位运算

C++

class Solution {
private:
    static int bitCount(int num){
        int count = 0;
        while(num > 0){
            num &= (num - 1);
            count++;
        }
        return count;
    }
public:
    vector<int> sortByBits(vector<int>& arr) {
        vector<int> map(arr.size());
        for(int i = 0; i < arr.size(); i++){
            map[i] = bitCount(arr[i]) * 100000 + arr[i];
        }
        sort(map.begin(), map.end());
        for(int i = 0; i < map.size(); i++){
            map[i] %= 100000;
        }
        return map;
    }
};

Java

class Solution {
    public int[] sortByBits(int[] arr) {
        int[] map = new int[arr.length];
        for(int i = 0; i < arr.length; i++){
            map[i] = Integer.bitCount(arr[i]) * 100000 + arr[i];
        }
        Arrays.sort(map);
        for(int i = 0; i < map.length; i++){
            map[i] %= 100000;
        }
        return map;
    }
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),其中 n 为数组的长度,。
  • 空间复杂度 O ( 1 ) O(1) O(1),法二为 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python flask sqlite http服务

python flask 服务 为了让拼接项目能够简单实用http服务&#xff0c;用python flask 来做一个http服务&#xff0c;使用python的原因是拼接项目本身很多人工智能的服务是用python来写。数据库为了简单实用sqlite&#xff0c;python自带sqlite3 ,很方便 db.sql CREATE TABLE …

AcWing 98. 分形之城

题目链接:AcWing 98. 分形之城 问题描述 分析 这一道题看起来很麻烦&#xff0c;其实就是比较麻烦。 这是一道递归坐标变换的问题&#xff0c;坐标变换比较难想&#xff0c;建议自己动手画一画容易明白一些。 首先是城市等级 n n n 与总点数的关系&#xff0c;不难发现总点数…

golang Redis的新数据类型github.com/go-redis/redis/v8实践

Redis的新数据类型# 在redis中&#xff0c;后面添加了几个比较高级的数据类型 hyperloglog基数统计、GEO存储地理位置、bitmap位图、stream为消息队列设计的数据类型 这 4 种数据类型。 HyperLogLog类型# HyperLogLog简介# HyperLogLog 是一种用于数据统计的集合类型&#x…

亚马逊云科技Zero ETL数据库,助力企业走向数据驱动的业务增长之路

据Forrester研究&#xff0c;相对于数据应用不够成熟的公司&#xff0c;那些有效获取业务洞察的公司&#xff0c;有高达8.5倍的可能性实现至少20%的收入增长。然而&#xff0c;要实现这一增长&#xff0c;需要简化一项流程——在数据分析前管理和准备好数据。这就是为什么亚马逊…

16.电容触摸按键

1.电容触摸按键介绍&#xff1a; R是外接的充电电阻&#xff0c; Cs是没有触摸按下的触摸感应区和四周覆铜区域的一个杂散的电容&#xff1b;当使用手指去触摸感应区时&#xff0c;手指和感应区形成一个电容Cx&#xff0c;开关是电容放电的一个开关&#xff0c;在实际设计中是利…

Ubuntu 22.04.2 LTS LTS x86_64 安装 stable-diffusion-webui 【2】基本版本完结。

前篇 Ubuntu 20.04 LTS x86_64 安装 stable-diffusion-webui_hkNaruto的博客-CSDN博客 内容太多&#xff0c;分第二篇继续 中途重装了机器&#xff0c;20.04 &#xff0c;apt upgrade后自动升级到22.04.2 现状&#xff1a;起来了&#xff0c;又没完全起来 启动日志 (stab…

如何在 Linux 中将本地网络 IP 设置为静态的

文章目录 对于普通的 Linux 操作系统对于 Red Hat Enterprise Linux 9 笔者的运行环境&#xff1a; CentOS 8 Red Hat Enterprise Linux 9 在 Linux 中将本地网络 IP 设置为静态的&#xff0c;只需要在那台 Linux 上设置即可。为了方便&#xff0c;这里笔者使用了 Xshell 来远…

手写操作系统--主引导扇区以及内核加载器

在CPU上电后&#xff0c;会自动将cs:ip置为f000:fff0,下图就是一个计算机刚上电的模拟&#xff1a; ffff00这里开始的代码是BIOS自检&#xff0c;检查计算机的硬件完备性&#xff0c;做完这一切后将第一个扇区的内容复制到0x7c00的位置&#xff0c;并从0x7c00位置执行代码&…

第五章 逻辑回归

第五章 逻辑回归 Logistic回归的⼀般过程 收集数据&#xff1a;采⽤任意⽅法收集数据。准备数据&#xff1a;由于需要进⾏距离计算&#xff0c;因此要求数据类型为数值型。另外&#xff0c;结构化数据格式则最佳。分析数据&#xff1a;采⽤任意⽅法对数据进⾏分析。训练算法&…

Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分

目录 341. 扁平化嵌套列表迭代器 Flatten Nested List Iterator &#x1f31f;&#x1f31f; 343. 整数拆分 Integer Break &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…

vscode工作区实现机制

工作区是编辑器的重要部分&#xff0c;它承载着编辑器和本地文件的连接&#xff0c;对文件增、删、改、查。下面我会介绍vscode工作区的创建。同样我们知道vscode软件打开的时候没有默认工作区&#xff0c;这里我对它进行了改造&#xff0c;软件启动时指向默认工作区。 工作区目…

提高腾讯QQ(电脑版)语音通话、视频聊天和远程协助的稳定性的方法

一、背景说明 腾讯QQ默认使用的通讯协议是UDP。但是各大运营商将UDP的优先级设置为最低&#xff0c;导致UDP数据包经常被丢弃。导致腾讯QQ在语音通话、视频聊天和远程协助的时候&#xff0c;会出现连接不上、卡顿和断线&#xff0c;非常不稳定。我们可以手动将通讯协议调整为TC…

用Python实现自动化交易:从趋势到收益

在现代金融市场中&#xff0c;自动化交易已经成为越来越流行的一种方式。相比于传统的手工交易方式&#xff0c;自动化交易更加高效、精准、快速且免除了人为因素的影响。而Python作为一种高级编程语言&#xff0c;凭借其简单易学、灵活性强的优势逐渐成为自动化交易中最受欢迎…

Ubuntu下Go语言TCP广播服务器实现

最近在学习Go语言网络编程&#xff0c;突然想到很久以前的用C语言写过的TCP广播聊天程序&#xff0c;然后就用Go尝试写了一遍&#xff0c;在此做个记录。 目录 1.广播结构 2.实现效果 3.源码 4.Go语言学习参考网站 1.广播结构 2.实现效果 服务器&#xff1a; 客户端1&…

小程序 web-view h5页面背景音乐自动播放

/*** 年度账单-登录首页*/ import React,{useEffect} from react import swiper/swiper-bundle.min.css import styles from ./styles.less import bgm from ./bgm2.mp3 // 主体 const annualAccountLoginIndex (props) > {const goAnnualAccount ()>{const {location: …

Java Web Tomcat 23.7.5

Tomcat 1, Tomcat 1.1 简介 1.1.1 什么是Web服务器 Web服务器是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff0c;让Web开发更加便捷。主要功能是"提供网上信息浏览服务"…

[Python系列] Python虚拟环境Virtualenv

1. 什么是Virtualenv Python virtualenv 是一个用于创建和管理虚拟环境的工具。它可以帮助开发者在不同的项目中使用不同的 Python 版本和包&#xff0c;而不会相互干扰。使用 virtualenv&#xff0c;可以轻松地创建一个独立的 Python 环境&#xff0c;在其中安装所需的包和版本…

【网络】思科网络vlan配置+单臂路由

文章目录 前言一、vlan&#xff08;虚拟局域网&#xff09;二、配置vlan配置交换机0配置交换机1&#xff08;和交换机0相同&#xff09;配置计算机&#xff1a;测试联通性 三、单臂路由配置R0配置交换机1测试配置&#xff1a; 前言 VLAN&#xff08;Virtual Local Area Networ…

力扣 491. 递增子序列

题目来源&#xff1a;https://leetcode.cn/problems/non-decreasing-subsequences/description/ 回溯三部曲&#xff08;来源代码随想录&#xff09;&#xff1a; 递归函数参数&#xff1a;求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&…

2023年 vue使用腾讯地图搜索、关键字输入提示、地点显示

先看结果 vue 在public文件下的index.html文件中引入&#xff1a; <script src"//map.qq.com/api/js?v2.exp&key你自己的key"></script><script src"https://map.qq.com/api/gljs?v1.exp&librariesservice&key你自己的key"&…