一.题目描述

  求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句 (即三元运算符,A? B : C)

二.题解

  虽然求和问题本身很容易,但加上这么多限制条件的话,整个问题似乎就不那么简单了。《剑指offer》虽然给出了四种解决方法,但这四种方法都是基于C++的语言特性求解的,并不是通用的解法。所以,本文旨在给出通用的解法。首先,根据以上的限制条件,可以考虑的角度只有两种(个人看法)一个是递归,另一个是位运算。从位运算的角度来考虑的话,可以利用类似快速幂的思想,但是这个角度不容易想到,且实现比较麻烦(可参考牛客网讨论区 马克的答案)。另一个角度就是递归,如果没有限制条件的话,使用递归的代码如下:

  1. int Sum_Solution(int n) {
  2. int sum = n;
  3. if(n == 0)
  4. return sum;
  5. return sum + Sum_Solution(n - 1);
  6. }

这段代码主要有两个关键点:递归的终止条件和如何进行下一步递归。回到原问题上,由于题目要求不能使用if来进行条件判断,所以我们要通过其他操作来实现n == 0的判断,最容易想到的就是&&操作符,它同样地能进行条件判断,这主要得益于它的一个特性:即A&&B的话,只有条件A满足的话,才会对条件B进行判断;否则就不会对条件B进行判断。这个特性就是所谓的与操作符的短路特性。根据这个特性,很容易想到改进后的代码:

  1. int Sum_Solution(int n) {
  2. int sum = n;
  3. bool flag = (n > 0) && ((sum += Sum_Solution(n-1)) > 0);//第一个条件(n > 0)相当于终止条件
  4. return sum;
    }

这段代码时间复杂度为O(n)。主要通过&&操作符,实现了与上段代码同样的操作,它们的逻辑本质上是一样的。只有当n>0的时候,sum才会进行下一次递归,否则就不会递归。又由于&&操作的返回的结果是0或1,所以定义一个布尔型的变量最为合适。

《剑指offer(第二版)》面试题64——求1+2+...+n的更多相关文章

  1. 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树

    一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...

  2. 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)

    一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...

  3. 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表

    具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...

  4. 《剑指offer(第二版)》面试题60——n个骰子的点数

    一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...

  5. 结合《剑指offer(第二版)》面试题51来谈谈归并排序

    一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6 ...

  6. 《剑指offer 第二版》题解

    剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...

  7. 剑指offer第二版-10.斐波那契数列

    面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归 ...

  8. 剑指offer第二版-5.替换空格

    面试题5:替换空格 题目要求: 实现一个函数,把字符串中的每个空格都替换成“%20”,已知原位置后面有足够的空余位置,要求改替换过程发生在原来的位置上. 思路: 首先遍历字符串求出串中空格的数量,求出 ...

  9. 剑指offer第二版-3.数组中重复的数

    面试题3:数组中重复的数 题目要求: 在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字. 解法比较: /** * Copyri ...

随机推荐

  1. Java学习NO.2

    这是我学习Java的第二天 学习内容: 一.运算符 赋值运算符  语法:变量名=表达式 算数运算符  +  -  *  /  %  ++  --   +=  -=  *=  /=  %= 其中尤为要注 ...

  2. 网络-Cisco

    选择题(每题2分,共20分) 1.192.168.11.1/23的网络地址是(  A) A.192.168.10.0 B.192.168.11.0 C.192.168.10.255 D.192.168 ...

  3. java 中根据类的属性排序

    package edu.del; import java.util.ArrayList; import java.util.Collections; import java.util.List; im ...

  4. 蓝屏代码PAGE_FAULT_IN_NONPAGED_AREA的解决方法

    就在昨天晚上,小王同学的电脑继1803更新后第4次蓝屏了,原本蓝屏后自动重启后就会恢复正常,然而天真的我太低估了微软的实力.蓝屏-重启-蓝屏-重启无限循环 当然,重启几次就进入了高级模式 高级模式 进 ...

  5. 2018-计算机系机试(第二批)-C-数字字符个数

    C. 数字字符个数 单点时限: 1.0 sec 内存限制: 256 MB 输入一行信息,输出其中包含的数字字符个数. 例如:输入 a<4 >w,输出 1 . 输入格式 一行字符串 (可能含 ...

  6. list quen队列

    队列特性:先进先出 stack 栈先进后出 push() 输入 pop()输出 set接口 collectonjiek list接口:可重复集(可以用下标取值) set接口:不可重复集(没下标) Ha ...

  7. ansible常用模块用法

    ansible常用模块用法 2015-07-21 10:25 24458人阅读 评论(1) 收藏 举报  分类: Linux(44)   ansible 版权声明:本文为博主原创文章,未经博主允许不得 ...

  8. google Kickstart Round F 2017 四道题题解

    Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...

  9. windows7 安装pytorch

    这几天为了运行python的图像转换的项目,不得不安装pytorch,安装了两天,最后把经验记录一下. 如果版本不匹配会抛出很多错误,而网上的各种解决方式有大部分也解决不了问题. 在安装pytorch ...

  10. flask-不错的教程

    https://spacewander.github.io/explore-flask-zh/7-blueprints.html