《剑指Offer》题目——位运算

题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

题目分析:无论使用什么方式,最关键的就是要考虑负数的处理方式

public class NumberOfOne {
    //方法一: 最优解
    public static int numberOfOnes(int n){
        int count =0 ;
        while (n!=0){
            n = n & (n-1);
            count++;
        }
        return count;
    }
    //方法二:考虑一下Java对应的数据类型的移位处理规则
    public static int numberOfOnes1(int n){
        int count = 0;
        int flag = 1;
        while (flag!=0 ){
            if ((n & flag) !=0 ){
                ++count;
            }
            flag = flag << 1;
        }
        return count;
    }
    public static void main(String[] args){
//        System.out.println(numberOfOnes(-3));
        System.out.println(numberOfOnes1(-2));

    }
}

扩展一下:

1. 用一条语句判断一个整数是不是2的整数次方

答:判断这个整数的二进制表示的1的个数是不是1个即可。

2. 输入两个整数m和n,计算需要改变m的二进制表示中多少位才能得到n。

答:分两步:1)求这两个数的异或,2)统计异或结果中1的个数

时间: 2024-08-06 19:46:57

《剑指Offer》题目——位运算的相关文章

剑指 Offer 题目汇总索引

剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格               时间:O(n) 空间:O(1) 5.从尾到头打印链表 6. 重建二叉树          && 二叉树的各种遍历(BFS,DFS,DLR,LDR,LRD) 7.用两个栈实现队列 8.旋转数组的最小数字 9.斐波那契数列第 n 项        时间O(lgn) 10.一个整数的二进制表示中

剑指 Offer 题目索引

剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格               时间:O(n) 空间:O(1) 5.从尾到头打印链表 6. 重建二叉树          && 二叉树的各种遍历(BFS,DFS,DLR,LDR,LRD) 7.用两个栈实现队列 8.旋转数组的最小数字 9.斐波那契数列第 n 项        时间O(lgn) 10.一个整数的二进制表示中

剑指offer题目系列三(链表相关题目)

本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码. 9.O(1)时间内删除链表结点 题目: 在O(1)时间内删除链表结点.给定单链表的头指针和一个结点指针,定义一个方法在O(1)时间内删除该结点. 单链表的定义如下: 解答: 单向链表删除一个结点,最直观的想法是从链表的头结点开始顺序遍历查找要

牛客网上的剑指offer题目

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一个字符串中的空格替换成"%20" 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 剑指offer 斐波那契数列 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个

剑指offer题目系列一

本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码,代码都是用Java语言编写的. 1.找出数组中重复的数字 题目:        在一个长度为n的数组里,所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2,3

剑指offer题目记录

1.如下为类型CMyString的声明,请为该类型添加赋值运算符函数. 2.设计一个类,我们只能生成该类的一个实例.   3.在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数.   4.请实现一个函数,把字符串中的每个空格替换成"%20".例如输入"We are happy",则输出"We%20are%20happy".   4_1

剑指Offer题目:字符串的排列

题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 题目分析: 最简单的是使用字典序生成法,这样可以把有重复字符串的情况也考虑进去. Java实现代码: import java.util.ArrayList; import java.util.Arrays; public class Solution { private ArrayList<String> r

剑指offer题目练习一

看见了一道二维数组找数的题,已排好序的数组(从左至右从上到下,都是由小变大的)让找数,瞬间就出思路了,并没有必要去看他的解释,两次二分就搞定了. #include<cstdio> #include<iostream> using namespace std; void sreach(int num[][100], int row, int line, int goal) { int i=0,j=row-1,mid; while((j-i)>1) { mid=(i+j)/2;

剑指offer题目分类

1. 链表 1. 从尾到头打印链表 2. 链表中倒数第k个结点 3. 反转链表 4. 合并两个排序的链表 5. 复杂链表的复制 6. 复杂链表的复制 7. 两个链表的第一个公共结点 8. 链表中环的入口结点 9. 删除链表中重复的结点 2. 二叉树 10. 重建二叉树 11. 树的子结构 12. 二叉树的镜像 13. 从上往下打印二叉树 14. 二叉搜索树的后序遍历序列 15. 二叉树中和为某一值的路径 16. 二叉搜索树与双向链表 17. 二叉树的深度 18. 平衡二叉树 19. 二叉树的下一

剑指offer题目--面试中的各项能力章

38 数字在排序数组中出现的次数 39 二叉树的深度 40 数组中只出现一次的数字 41 和为s的两个数字 VS 和为s的连续正数序列 42 反转单词顺序 VS 左旋转字符串 43 n个骰子的点数 44 扑克牌的顺子 45 圆圈中最后剩下的数字 46 求1+2+...+n 47 不用加减乘除做加法 48 不能被继承的类 原文地址:https://www.cnblogs.com/coding-fairyland/p/12333536.html