《剑指offer(第二版)》面试题64——求1+2+...+n
一.题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句 (即三元运算符,A? B : C)
二.题解
虽然求和问题本身很容易,但加上这么多限制条件的话,整个问题似乎就不那么简单了。《剑指offer》虽然给出了四种解决方法,但这四种方法都是基于C++的语言特性求解的,并不是通用的解法。所以,本文旨在给出通用的解法。首先,根据以上的限制条件,可以考虑的角度只有两种(个人看法)一个是递归,另一个是位运算。从位运算的角度来考虑的话,可以利用类似快速幂的思想,但是这个角度不容易想到,且实现比较麻烦(可参考牛客网讨论区 马克的答案)。另一个角度就是递归,如果没有限制条件的话,使用递归的代码如下:
int Sum_Solution(int n) {
int sum = n;
if(n == 0)
return sum;
return sum + Sum_Solution(n - 1);
}
这段代码主要有两个关键点:递归的终止条件和如何进行下一步递归。回到原问题上,由于题目要求不能使用if来进行条件判断,所以我们要通过其他操作来实现n == 0的判断,最容易想到的就是&&操作符,它同样地能进行条件判断,这主要得益于它的一个特性:即A&&B的话,只有条件A满足的话,才会对条件B进行判断;否则就不会对条件B进行判断。这个特性就是所谓的与操作符的短路特性。根据这个特性,很容易想到改进后的代码:
int Sum_Solution(int n) {
int sum = n;
bool flag = (n > 0) && ((sum += Sum_Solution(n-1)) > 0);//第一个条件(n > 0)相当于终止条件
return sum;
}
这段代码时间复杂度为O(n)。主要通过&&操作符,实现了与上段代码同样的操作,它们的逻辑本质上是一样的。只有当n>0的时候,sum才会进行下一次递归,否则就不会递归。又由于&&操作的返回的结果是0或1,所以定义一个布尔型的变量最为合适。
《剑指offer(第二版)》面试题64——求1+2+...+n的更多相关文章
- 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...
- 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...
- 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表
具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...
- 《剑指offer(第二版)》面试题60——n个骰子的点数
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...
- 结合《剑指offer(第二版)》面试题51来谈谈归并排序
一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6 ...
- 《剑指offer 第二版》题解
剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...
- 剑指offer第二版-10.斐波那契数列
面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归 ...
- 剑指offer第二版-5.替换空格
面试题5:替换空格 题目要求: 实现一个函数,把字符串中的每个空格都替换成“%20”,已知原位置后面有足够的空余位置,要求改替换过程发生在原来的位置上. 思路: 首先遍历字符串求出串中空格的数量,求出 ...
- 剑指offer第二版-3.数组中重复的数
面试题3:数组中重复的数 题目要求: 在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字. 解法比较: /** * Copyri ...
随机推荐
- 第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下
首先先对这段代码的简单介绍,我之前在需要操作JDBC的时候总是会因为经常要重新写SQL语句感到很麻烦.所以就能拿则拿不能拿的就简单地封装了一下. 首先是Insert.Spring框架的JDBC包里面的 ...
- zt secureCRT serialNo
Name: ygeR Company: TEAM ZWT SerialNumber: 03-77-119256 License Key: ABH2MJ 9YVAC5 Z17QF7 4ZAS7Z ABG ...
- 转载 * jQuery实现动态分割div—通过拖动分隔栏实现上下、左右动态改变左右、上下两个相邻div的大小
由jQuery实现上下.左右动态改变左右.上下两个div的大小,需要自己引入jquery1.8.0.min.js包 可用于页面布局. //============================ind ...
- Python爬虫--简单的单词查询
Refer to: https://github.com/gaopu/Python/blob/master/Dict.py 本程序参考自上面Github连接 该程序功能是输入一个单词可以给出这个单词的 ...
- react-native-printer
react-native-printer A React Native Library to support USB/BLE/Net printer for Android platform Inst ...
- Charles Map Local 中文显示乱码问题
最近在迁移客户端的业务,用React Native实现,在用本地数据测试Android的时候,遇到到中文乱码的问题.是因为编码问题. 一.首先看看文件编码是否是UTF-8,我的电脑是安装了Sublim ...
- Linux CPU瓶颈问题分析
虚线部分为`下一步`的分析方向,图是网络抄的,放这里更容易找
- java GMT时间转换为CST时间
今天在获取windchill的“上次修改时间”的时候发现获取的是GMT时间,但是我们常用的是CST时间 一开始尝试直接设置为CST时区,TimeZone.getTimeZone("CST&q ...
- Java基于opencv实现图像数字识别(五)—腐蚀、膨胀处理
腐蚀:去除图像表面像素,将图像逐步缩小,以达到消去点状图像的效果:作用就是将图像边缘的毛刺剔除掉 膨胀:将图像表面不断扩散以达到去除小孔的效果:作用就是将目标的边缘或者是内部的坑填掉 使用相同次数的腐 ...
- Web应用程序的安全问题
常规的安全问题主要分为以下几大类 一,跨站脚本攻击(XSS) 指的是攻击者向web页面注入恶意的Javascript代码,然后提交给服务器,但是服务器并没有做校验和转义等处理,随即服务器的响应页就被植 ...