剑指offer算法_位运算求和

不用+,-,*,/运算求和,可以分成三步:

1.计算两个数字的异或值,相当于只计算每一位的和,不计算进位,得出结果sum;

2.计算两个数字的与值,相当于求出两个数字的进位,然后左移一位,相当于进位,得出结果jw;

3.求sum和jw的和,步骤与1,2相同,直到进位jw==0停止计算;

扩展:

不申请额外内存实现两个变量值得交换:

方法一:

通过异或来实现;

  a=a^b;

  b=a^b;

  a=a^b;

方法二:

通过加减运算实现;

  a=a+b;

  b=a-b;

  a=a-b;

时间: 2024-12-21 15:16:14

剑指offer算法_位运算求和的相关文章

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

位运算: 左移:m<<n将m左移n位,左移后低位补充0: 右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF)) 题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数. 思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0:该算法的时间复杂度为输入的i的位数.

《剑指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对应的数据类型的移位处理规则 publ

剑指offer算法总结

剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看了几遍多做了几遍多了点心得体会.于是想总结一下.如果有错误也希望能指出,谢谢. 具体代码可以参考我的GitHub仓库: https://github.com/h2pl/SwordToOffer 数论和数字规律 从1到n整数中1出现的次数 题目描述 求出1~13的整数中1出现的

剑指offer算法思想

3. 数组中重复的数字 算法步骤:遍历该数组nums,从第一个数字开始,判断 1)如果nums[i]和下标的值i一样,就跳到下一个数字 2)如果不一样,那么就判断,nums[i]是否等于nums[nums[i]],如果等于,输出该数字nums[下标值], 如果不等于,那么就调整nums[i]和nums[nums[i]]的顺序.继续重复1)和2) 4. 二维数组中的查找 算法步骤: 1)获取行数rows和列数cols 2)确定从第一行r和最后一列c开始,即从右上角开始 3)while循环,行数r<

经典算法_位运算

1 按位异或 适用于:面试,嵌入式开发需要节约内存的场合 不借助中间变量,交换2个变量 x=x+y y=x-y x=x-y 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 unsigned char ch1 = 10; 9 unsigned char ch2 = 20; 10 11 printf("%d,%d\n", ch1

剑指offer算法编程题目部分汇总(解法略)

总结一下本书中遇到的大部分面试题.面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下递增的顺序排列,请完成一个函数,输入这样的一个整数,判断数组中是否含有该整数. 面试题4:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成%20. 面试题5:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印每个结点的值. 面试题6:重建二叉树 题目:输入某二叉树前序遍历和中序遍历的结果,请重建出该二叉树.假设节点没有重复的. 面试

剑指offer:二位数组中的查找

准备找实习期间,复习一下数据相关内容,刷刷题. 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路: 思路一:由于数组有序,一开始直接想每一行分别用二分来做,结果超时,分析下来这样做的复杂度是O(nlogn). 思路二:换个角度,同样是二分,但是考虑到右上角的数是当前行的最大值,是当前列的最小值,处于一个中间状态.所以每次选择右上角元

整理剑指offer&mdash;链表操作

在链表中找到第一个含有某值的节点并删除该节点. 在这里我创建的链表里,头节点是不包含有效数据的,它只是起一个辅助作用,真正的链表数据从首节点开始. typedef struct Node{    int data; //数据域    struct Node * pNext; //指针域}NODE, *PNODE; 1: void RemoveNode(PNODE pHead, int val) 2: { 3: if(pHead == NULL || pHead->pNext == NULL) 4

《剑指Offer》附加题_用两个队列实现一个栈_C++版

在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来.虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换. 在"用两个队列实现一个栈"问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出.我们通过画图的手段把抽象的问题形象化. 在上