剑指offer中二进制中1的个数

容易想到的是将n一位一位的和1进行比较,产生如下代码

但是这样的话会出下面的问题

那么就是原数据不动,将1依次移动进行比较有如下的代码

一种更简单的方法是:

这样做的思路是

总而言之

时间: 2024-10-11 05:33:29

剑指offer中二进制中1的个数的相关文章

leetcode 338. Counting Bits,剑指offer二进制中1的个数

leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种方法,利用奇偶性找规律 class Solution { public: vector<int> countBits(int num) { vector<int> result{0}; for(int i = 1;i <= num;i++){ if(i % 2 == 0) res

[剑指offer] 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入描述 一个整数 输出描述 该数二进制表示中1的个数 题目分析 解法一 运行时间:29m 占用内存:629k public int NumberOf1(int n) { String s=Integer.toBinaryString(n); char[] c=s.toCharArray(); int j=0; for(int i=0;i<c.length;i++){ if(c[i]=='1'){ j++; } } re

剑指offer—二进制中1的个数

题目: 实现一个函数,输入一个整数,输出该数二进制表示中1的个数.如9的二进制是1001,因此输入9输出2. 解法一:可能死循环 int num1(int n) { int count =0; while(n) { if(n&1) count++; n=n>>1; } return count; } 上面的函数如果输入一个负数,如果一直做右一运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环. 解法二:无死循环但效率低 int num1(int n) { int count =

剑指offer.二进制中1的个数(位运算)

题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. #include <iostream> #include <cstdio> #include <cstring> #include<vector> using namespace std; class Solution { public: int NumberOf1(int n) { int count=0; unsigned int mark=1; while(mark){ if

剑指offer——二进制中0的个数

题目链接:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路: 数字-1做与操作 1 public class Solution { 2 public int NumberOf1(int n) { 3 4 int count=0; 5 6 while(n!=0) 7 { 8 count++; 9 n = n &(n-1); 10 } 11 return count; 12 13 } 14 } 原文地址:https://www.cnblogs.com/wangyufeiai

剑指offer——二进制中1的个数(c++)

题目描述实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,则输出为2 常规解法首先把n和1做位运算,判断n的最低位是不是1,然后把1左移一位得到2,再把n和2做位运算,判断n的次低位是不是1…这样反复左移.循环的次数等于整数二进制的位数,32位的整数需要循环32次. class Solution { int NumberOfOne(int n){ int cnt = 0; unsigned int flag = 1; while(flag){ if(n

剑指Offer08 二进制中1的个数

1 /************************************************************************* 2 > File Name: 08_NumOf1InBinary.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月29日 星期一 20时40分15秒 6 ************************************

剑指offer系列55---最小的k个数

[题目] 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *[思路]排序,去除k后的数. 1 package com.exe11.offer; 2 import java.util.ArrayList; 3 import java.util.Collections; 4 /** 5 *[题目] 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 6

剑指Offer对答如流系列 - 最小的k个数

面试题40:最小的k个数 题目描述 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 问题分析 最容易想到的方法就是排序,取相应数字的元素即可.我这里为了方便直接使用了快排来做这个. 想拉开与别人的差距,难免需要优化时间效率,我们可以这样做:依次遍历n个整数,用一个容器存放最小的k个数字,每遇到比容器中最大的数字还小的数字时,将最大值替换为该数字.容器可以使用最大堆或者红黑树来实现.堆相比红黑树更容易实现,我们这里采用堆.