《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复。

【题目】
剑指offer

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

【思路】
直觉想到用二进制的位运算。最后写出来是一个迭代的过程。
每次迭代先计算x和y的和但不处理进位,那么相当于做异或,得到res1
然后处理进位问题,相当于计算与运算,得到res2
那么res2左移1位,再加到res1上,则整个运算的最终结果转化为res1+(res2<<1)
因为res2做左移,总会减小到0,那时候的res1就是最终结果

class Solution{
public:
    int Add(int x, int y){
        int sum;
        int carry;

        while (true){
            sum = x^y;
            carry = (x&y) << 1;
            y = carry;
            x = sum;
            if (y == 0){
                break;
            }
        }
        return sum;
    }
};
时间: 2024-08-11 10:02:09

《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。的相关文章

剑指offer系列之五:用两个栈实现队列

题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 栈的特点是先进后出,而队列的特点是先进先出.题目中提到使用两个栈实现队列,好像有戏.现在问题是如何把栈的出栈和入栈与队列的入队和出队联系起来?因为现在只有栈,所以在实现的队列中,只能先往栈中添加元素,这点比较好理解:那么出队呢,由于先进去的元素被压在栈底,而如果是队列的话,必须是栈底的那个元素先出队.现在可以使用第二个栈,思路是把原先第一个栈中的元素出栈,并压入第二个栈中,观察第二个栈,就可以发现:在

剑指offer系列之十一:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 首先,我觉得这道题思路应该很简单,幂的情况无非是三种:正数.0和负数.当幂是0的时候,直接返回1:当幂是负数的时候,需要先把其转化为正数来处理,然后返回其倒数就可以了:当幂是正数的时候,按照正常的计算方法就可以.实际上这道题主要考察时代码的健壮性--就是对幂的情况的考虑是否周全.下面是实现的代码(已被牛客AC): package com.rhwayfun.offer; pub

剑指offer系列之四十七:不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号 既然不能使用加减乘除,那么只剩下位运算和逻辑运算了.采用位运算的思路分为三步走:第一步,不进位对两个做异或运算(因为不考虑进位,1与1,0与0的异或运算的结果刚好是两者相加的结果):第二步,通过与运算得到两个数的进位值,因为只有1与1进行与运算的时候才会产生进位,所以产生的进位可以看成是两者先进行与运算再左移一位:第三步,把前两步的结果做与运算得到最后的结果.个人觉得这种思路是在是太赞了.OK,事就成了.下面

剑指offer:包含min函数的栈

剑指offer上的第21题,之前在Cracking the Coding interview上做过,思路参考这里,这次写了测试函数,在九度OJ上测试通过. 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci

剑指offer之和为定值的两个数

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到,则输出"-1 -1" 样例输入: 6 15 1 2 4 7 11 15 样例输出:

[剑指Offer]9.用两个栈实现队列

题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 用栈来模拟队列.我们首先插入一个元素a到stack1中,再压入两个元素bc,此时栈中有元素abc,其中c位于栈顶,而stack2仍然为空.我们试着删除一个元素.按照队列先进先出的原则,我们应该先删除元素a.元素a存放在stack1中且不在栈顶,因此不能直接删除.注意到stack2还未使用,我们把stack1中的元素逐个弹出并压入stack2中,stack2中的元素是cba,栈顶元素是a,我们现在可以

剑指Offer之和为S的两个数字

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和.其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出两个数,小的先输出.如果找不到,则输出"-1 -1" 样例输入: 6 15 1 2 4 7 11 15 样例输出:

剑指Offer之合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1

[剑指Offer] 第4章课后题详解

[剑指Offer] 第4章课后题详解 目录 剑指Offer 第4章课后题详解 目录 二叉树的镜像 分析 解法 拓展 判断前序遍历 分析 解法 拓展 字符的组合 分析 解答 正方体的顶点 分析 解法 8个皇后 分析 解法 二叉树的镜像 本题为<剑指Offer>"面试题19:二叉树的镜像"一节中的"本题拓展". 请完成一个函数,输入一个二叉树,该函数输出它的镜像,要求使用循环的方法,不能用递归.二叉树节点定义如下: struct BinaryTreeNode