Leetcode 剑指Offer

2023-10-31

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

示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

一、信息

1.求一个等差数列的求和

2.要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

二、分析

1.如果没有这些限制只需要循环然后++就行了,面对如此离谱的要求该怎么办呢?

我的思路:

思路1:数学法,直接用等差数列求和公式直接解决过程中只需要输入输出即可简单快捷。让我检查一下满不满足,我测不满足有应为不能出现乘除号,好的这条路走不通

思路2:递归。

我的答案:

这个问题是一个经典的数学问题,通常可以使用公式 `n(n+1)/2` 直接解决。但由于题目限制了我们不能使用乘除和条件判断等,我们需要考虑其他方法。我们可以使用递归的方法,并利用逻辑运算符来实现递归的终止条件,避免使用禁止的关键字。

下面是各种语言的实现:

### C语言

int sumNums(int n){
    n && (n += sumNums(n - 1));
    return n;
}

### C++

int sumNums(int n) {
    n && (n += sumNums(n - 1));
    return n;
}

### Java

public int sumNums(int n) {
    boolean x = n > 1 && (n += sumNums(n - 1)) > 0;
    return n;
}

### 思考过程和分析过程

1. **思考过程**

   - 首先,我们明确不能使用常规的循环和条件语句来解决这个问题。
   - 接着,我们考虑可以使用什么方法来代替这些操作。递归是一个很好的选择,因为它可以帮助我们完成迭代的过程。
   - 然后,我们需要一个终止条件来结束递归。由于不能使用常规的条件语句,我们可以使用逻辑运算符来实现这一点。

2. **分析过程**

   - 我们设置递归函数 `sumNums(n)`,其功能是计算从 1 到 n 的和。
   - 使用逻辑运算符 `&&` 来设置终止条件。在 `n && (n += sumNums(n - 1))` 这段代码中,如果 n 为 0,则后面的递归调用不会执行,实现了递归的终止。
   - 通过递归调用,我们能够逐步累加从 n 到 1 的所有数。

3. **时间复杂度和空间复杂度**
   - 时间复杂度:O(n),因为我们进行了 n 次递归调用。
   - 空间复杂度:O(n),递归调用会使用栈空间,最深达到 n 层。

通过这种方法,我们可以在满足题目限制的情况下求解这个问题。

英雄师傅答案:

int sumNums(int n){
	int sum=0;
	n&&(sum=n+sumNums(n-1));
	return sum;
}

总结:

学到什么?

从这个题目中,我们可以学习到以下几点:

1. **递归的使用和理解**:递归是计算机科学中一个重要的概念。这个题目提供了一个很好的机会来理解和练习如何使用递归来解决问题。

2. **条件语句的替代方案**:由于我们不能使用常见的条件语句,我们需要找到其他方法来实现条件检查。这可以帮助我们更好地理解条件语句的工作原理,并学习如何使用逻辑运算符作为条件语句的替代方案。

3. **逻辑运算符的短路行为**:逻辑运算符(如 `&&` 和 `||`)具有短路行为,这意味着如果第一个操作数能够确定整个表达式的值,那么第二个操作数将不会被评估。我们可以利用这一特性来创建条件语句的替代方案。

4. **创新思维和问题解决能力**:由于题目的特殊要求,我们需要跳出常规的思维模式,尝试新的方法来解决问题。这可以帮助我们培养创新思维和问题解决能力。

5. **代码简化和优化**:在特定的条件下(如本题的限制),我们可以探索如何通过简化和优化代码来满足条件,这也是一种对代码优化的练习。

6. **深入理解编程语言的特性**:通过这种非常规的练习,我们可以更深入地理解编程语言的特性和工作原理。

7. **数学知识的应用**:虽然题目禁止我们直接使用数学公式,但我们仍然需要基本的数学知识来理解和解决问题。

8. **细节处理**:在实现递归函数时,我们需要注意处理边界条件和特殊情况,这可以帮助我们提高对细节的关注和处理能力。

综上所述,这个题目可以作为一个很好的机会来练习和加深我们对编程和算法设计的理解和技能。

 思维和方法:

这个题目还能让我们学到如下一些思维和方法:

1. **递归思维**:学会运用递归思维解决问题,这不仅仅限于编程,也可以应用于其他需要分层处理或分步解决的问题场景。

2. **位运算和逻辑运算的灵活应用**:学习如何利用位运算和逻辑运算来实现复杂的条件控制,是提升编程技能的一个方向。

3. **“约束性创新”思维**:有时候,在一些特定的约束条件下进行问题解决,可以激发出非常有创意的解决方案,这是一种“约束性创新”思维。

4. **反向思维**:在不能使用常规方法的情况下,尝试使用反向思维来找到解决问题的新路径,这也是一种非常有价值的思维训练。

5. **函数式编程思维**:虽然这个题目不是典型的函数式编程问题,但是通过递归,我们可以体验到一些函数式编程的思想,比如避免使用循环和条件语句,使用函数来表达复杂逻辑等。

6. **测试驱动开发(TDD)**:由于题目的特殊性,我们需要非常仔细地考虑边界条件和特殊情况,这是测试驱动开发的一个重要方面。

7. **算法优化和性能分析**:通过这种题目,我们可以学习到如何对算法进行优化,以及如何分析算法的时间和空间性能。

8. **探索和实验**:这种题目鼓励我们进行探索和实验,尝试不同的方法和技术来找到最佳的解决方案。

9. **问题分解和抽象**:学会将大问题分解成小问题,并通过抽象来简化问题,是解决复杂问题的一种有效方法。

通过这个题目,我们可以培养这些有价值的思维和方法,这不仅可以帮助我们更好地解决编程问题,也可以提升我们的整体思维能力和问题解决能力。

思想:

这个题目还能启发我们在解决问题时采纳以下一些重要思想:

1. **灵活性思想**:即便是在一系列的限制之下,我们仍然可以找到问题的解决方法。这种灵活性的思维方式可以应用于生活和工作的各个方面。

2. **简化复杂性**:通过将问题分解为更小的部分(例如使用递归来简化问题),我们可以更容易地解决复杂问题。这是一种重要的思维方式,可以帮助我们在面对复杂问题时保持清晰的头脑。

3. **持续学习和适应性**:这个题目可以看作是一种学习新技术和策略的机会,它鼓励我们不断学习和适应新的方法和技术,以更好地解决问题。

4. **挑战传统思维**:这个题目挑战了我们对于常规编程范式的理解(例如使用循环和条件语句来解决问题),这可以帮助我们打破传统的思维模式,寻找新的解决方案。

5. **创意和创新**:这个题目鼓励我们思考新的、创意的解决方案。这是一种鼓励创新和创意思维的好方法。

6. **批判性思维**:这个题目要求我们仔细考虑我们的解决方案和方法,以确保它们满足所有的条件和限制。这是一种培养批判性思维的好机会。

7. **解决实际问题的能力**:虽然这个题目是一个编程练习,但它也可以看作是一个模拟实际问题的例子。通过解决这样的问题,我们可以培养我们的实际问题解决能力。

8. **耐心和坚持**:由于这个题目的特殊性和难度,解决它需要一定的耐心和坚持。这是一个培养我们耐心和坚持的好机会。

综上所述,这个题目可以启发我们在解决问题时采纳一系列有价值的思想和策略,这些思想和策略不仅适用于编程,也可以应用于我们的日常生活和工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode 剑指Offer 的相关文章

  • 在 XML 中,带问号的节点叫什么?在 C# 中如何添加它们?

    以下是在 InfoPath 中创建的 XML 文件的示例
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 集群():是否可以仅检查文件是否已锁定,而不实际获取锁定(如果没有)?

    我的用例如下 我有一个程序 它强制在任何给定时间只能运行它的一个实例 因此在启动时它总是尝试在标准位置获取锁定文件 并在该文件终止时终止已经被锁定 这一切都工作正常 但现在我想用一个新的命令行选项来增强程序 当指定该选项时 将导致程序只打印
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • 如何在 Google Mock 中使用可选参数来模拟方法?

    如何使用可选参数模拟方法谷歌模拟 例如 class A public void set enable bool enabled true class MockA public A MOCK METHOD1 set enable void b
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • 将二进制长字符串转换为十六进制 C#

    我正在寻找一种将长二进制字符串转换为十六进制字符串的方法 二进制字符串看起来像这样 0110011010010111001001110101011100110100001101101000011001010110001101101011 我

随机推荐

  • nn.LayerNorm的实现及原理

    LayerNorm 在transformer中一般采用LayerNorm LayerNorm也是归一化的一种方法 与BatchNorm不同的是它是对每单个batch进行的归一化 而batchnorm是对所有batch一起进行归一化的 y x
  • 是面试官放水,还是公司实在是太缺人?这都没挂,腾讯原来这么容易进···

    本人211非科班 之前在字节和腾讯实习过 这次其实没抱着什么特别大的希望投递 没想到腾讯可以再给我一次机会 还是挺开心的 本来以为有个机会就不错啦 没想到能成功上岸 在这里要特别感谢帮我内推的同学 中间投递比较曲折 是他帮了我很多 非常负责
  • ARM64架构-Ubuntu20更换国内镜像源

    前言 在嵌入式开发中 常用到ARM64的开发平台 进行下载东西时想换国内源 下面以中科大源为参考 一 什么是源 其实吧它就像苹果和案桌的软件应用商店一样 为Linux用户提供软件下载及更新服务的 Linux家族有三个软件源系统 yum源 使
  • 逆向crackme之ESp定律脱壳

    1 前言 此题来自攻防世界高手进阶区的一道逆向题目 crackme 通过对可执行程序进行脱壳 该壳为北斗的壳 涉及到ESP定律 大体流程是找到call处的ESp 在数据窗口中跟随 下个硬件访问断点 就到了OEP处 用ODdump脱壳就行了
  • 使用Docker高效搭建开发环境(详细教程)

    在学习Docker镜像和容器之前 先给大家介绍下Docker的概念 在理解概念的基础上可以举一反三 1 Docker的核心为镜像和容器 有JAVA基础的小伙伴们可以理解为镜像就是JAVA中的类 容器为相关类的对象 一个镜像可以创建多个容器
  • ffmpeg快速将mkv转mp4

    想用pr来剪一些动漫视频 视频是mkv格式的 但是我的pr pro2021不支持mkv格式 只能先转成mp4格式再用pr剪切 ffmpeg的格式转换是最快的 官网下载ffmpeg https github com BtbN FFmpeg B
  • 【环境搭建】(二)在Ubuntu22.04安装/卸载软件Anaconda

    一个愿意伫立在巨人肩膀上的农民 1 Anaconda的主要功能 Anaconda是一个Python环境管理工具 因为不同的Python项目中可能需要同一个库的不同版本 为了避免冲突 Anaconda可以对不同Python项目创建自己的运行环
  • 生活笑话

    n多年前 传呼机还算比较稀罕的时候 有师兄A买了传呼机 师兄B说 要试一试看 好使不 遂打电话到呼台 小姐 请呼 站在那里不要动 等我们过去打你 小姐大惊 这种信息我们不能发 B师兄坚持 就得这么发 不一会儿 呼机响起 拿起一看 有人要打你
  • 详细讲述C++各种运算符重载

    详细讲述C 各种运算符重载 1 等号运算符重载 2 加号运算符重载 3 取地址运算符重载 4 前置 后置 运算符重载 4 1后置 的引用问题 4 2相关问题分析 5 重载类型强转运算符 6 括号运算符重载 7 输出运算符重载 8 星号运算符
  • jetbrains phpstorm插件开发环境搭建

    2018 04 14 重要更新 使用 gradle 进行构建可以免去下面大部分步骤 使用 gradle 我们仅需下载安装 JDK Idea 使用 gradle 的方法是 新建 Project 然后选择如下 使用 gradle 的好处是 不用
  • C++多态(虚函数)使用详解

    目录 1 什么是多态 1 1父类指针指向子类指针案例 2 多态 虚函数的基本使用 3 多态 虚函数表 3 1单个类的虚函数表 3 2使用继承的虚函数表 3 3多重继承的虚函数表 4 虚函数的修饰 4 1虚函数的修饰 final 4 2虚函数
  • windows 更改pip源

    在c user 或者用户 电脑的用户名 目录下创建一个命名为 pip 的文件夹 如 C Users Administrator pip 在该文件夹下创建一个命名为 pip ini 的文件 在该文件中写入以下内容 global index u
  • SpringBoot之定时任务详解

    使用SpringBoot创建定时任务 目前主要有以下三种创建方式 一 基于注解 Scheduled 二 基于接口 SchedulingConfigurer 前者相信大家都很熟悉 但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任
  • 客观面试题--37.Spring/SpringMVC常用注解有哪些?

    Spring常用注解 使用注解来构造IoC容器 用注解来向Spring容器注册Bean 需要在applicationContext xml中注册
  • Microsoft Exchange ProxyShell Remote Code Execution CVE-2021-34473 (Metasploit exploits)分析

    CVE 2021 34473 加载winrm模块文件 Windows专用链接对象 https github com WinRb WinRM require winrm class MetasploitModule lt Msf Exploi
  • gdb调试,splint_valgrind代码检查

    文章目录 基本调试命令 语法 为什么没有产生core 文件 一 GDB 1 test 2 常用命令 3 使用core 二 代码检查 1 splint 2 valgrind 常见错误 命令格式 test1 test2 编译一个多种内存使用错误
  • Minor GC 过程

    如果Eden空间占满了 会触发 minor GC Minor GC后仍然存活的对象会被复制到S0中去 这样Eden就被清空可以分配给新的对象 又触发了一次 Minor GC S0和Eden中存活的对象被复制到S1中 并且S0和Eden被清空
  • TypeScript 最快速的入门教程

    TypeScript 最快速的入门教程 在线阅读 https niexia github io typescript tutorial 英文原版 https www typescripttutorial net 如果对你有帮助 欢迎在 gi
  • HarmonyOS开发详解(二)——鸿蒙开发体系详解及入门实例演示运行

    本篇文章的计划 先体系的介绍一下鸿蒙开发相关的体系内容 希望通过本篇内容构建对鸿蒙开发体系的了解 最后再来一个最简单入门例子 既是自我的学习 也希望对你了解鸿蒙开发的全貌有帮助 这样安排而没有直接写一个Helloworld例子的原因 很多朋
  • Leetcode 剑指Offer

    求 1 2 n 要求不能使用乘除法 for while if else switch case等关键字及条件判断语句 A B C 示例 1 输入 n 3 输出 6 示例 2 输入 n 9 输出 45 一 信息 1 求一个等差数列的求和 2