Leetcode 剑指Offer

news2024/11/25 2:59:12

求 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. **耐心和坚持**:由于这个题目的特殊性和难度,解决它需要一定的耐心和坚持。这是一个培养我们耐心和坚持的好机会。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dubbo3 遇坑小结

最近给一个dubbo3的应用改名字,发现消费者还是会请求以前的地址。 问题现象 应用部署是k8s容器环境,dubbo版本是3.1.1,应用appA名字改成appB。改完名发现消费者应用appC请求还是会往以前的地址请求(当然是请求不通的) 问题分析 分析日志 d…

算法|Day52 单调栈3

LeetCode 84.柱状图中最大的矩形 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状…

【LeetCode-简单题 KMP匹配算法】28. 找出字符串中第一个匹配项的下标

文章目录 题目方法一:常规做法 一次一次截取再做比较方法二:KMP匹配算法 题目 方法一:常规做法 一次一次截取再做比较 class Solution {public int strStr(String haystack, String needle) {int haylen haystack.length();int neelen need…

【二叉树】的顺序存储(堆的实现)

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

【学习笔记】各类基于决策单调性的dp优化

文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…

老挝市场最全开发攻略

本文目录: 1.老挝国家概况 2.老挝节日与禁忌 3.老挝贸易现状与特点 4.老挝热销品类 5.老挝开发渠道 6.老挝注意事项 7.老挝国家冷知识 一、老挝国家概况 老挝人民民主共和国(The Lao People’s Democratic Republic),简称…

基于python求两个数最大公约数函数gcd

一、gcd函数 在Python中,可以使用math模块中的gcd()函数来求两个数的最大公约数。首先需要导入math模块,然后使用gcd()函数来计算最大公约数。 二、示例 以下是使用Python求两个数最大公约数的示例代码: import math # 定义两个数 a 36 …

20230916后台面经整理

1.面对抢优惠券这样的高负载场景,你从架构、负载均衡等方面说一下你的设计? 答了参考Nginx进行负载均衡,然后在每台服务器怎么怎么弄(架构每一层怎么设计) 参考https://toutiao.io/posts/6z3uu2m/preview,h…

go 1.18新特性(泛性 模糊测试 WorkSpace)

文章目录 泛型interface的功能扩展泛型使用 模糊测试模糊测试的使用模糊测试的缺点 Go WorkSpace 泛型 interface的功能扩展 在1.18之前,官方对interface的定义是方法的集合,可以存储实现该方法的任意类型。1.18对interface的定义改为类型集合。接口类…

前端实现打字效果

前端实现打字效果 不带光标 只一次播放 HTML <!-- 需要在初始化的时候不显示文字 --> <div id"typing"></div>CSS #typing {position: relative;font-size: 24px;font-family: Arial, sans-serif;padding: 10px; }JS const text "要显…

CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

前面的文章已经介绍了Canvas 组件、UITransform 组件、Widget 组件 。 想了解的朋友&#xff0c;请查看 CocosCreator3.8研究笔记&#xff08;十七&#xff09;CocosCreator UI组件&#xff08;一&#xff09;。 今天我们主要介绍CocosCreator 常用容器组件&#xff1a;Layout …

JavaScript-Ajax-axios-Xhr

JS的异步请求 主要有xhr xmlHttpRequest 以及axios 下面给出代码以及详细用法&#xff0c;都写在了注释里 直接拿去用即可 测试中默认的密码为123456 账号admin 其他一律返回登录失败 代码实例 <!DOCTYPE html> <html lang"en"> <head><…

预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 预编译防止SQL注入 1、SQL执行过程2、预编译原理3、…

爬虫框架Scrapy学习笔记-1

前言 在现代互联网时代&#xff0c;网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究&#xff0c;还是进行数据分析&#xff0c;掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程&#xff0c;包括网络请求、…

银河麒麟操作系统安装人大金仓数据库--九五小庞

一、环境要求 硬件&#xff1a;内存512M以上&#xff0c;磁盘空间10G以上软件&#xff1a;主流Linux操作系统&#xff0c;本机使用kylin-v10安装包准备&#xff1a;官网下载数据库文件镜像以及授权文件 https://www.kingbase.com.cn/rjcxxz/index.htm 二、配置内核参数 vim /e…

Windows11 环境安装Gradle

Gradle和maven对比 maven 经典好用&#xff0c;约定大于配置的方式&#xff0c;使其上手简单&#xff0c;但灵活性稍差。 使用xml配置方式管理依赖&#xff0c;看起来稍丑。 在大型项目上&#xff0c;每次编译都要重新执行所有步骤会导致耗时很长。 Gradle 更加现代的构建工具…

高阶数据结构(2)-----红黑树(未完成)

一)红黑树的基本概念和基本性质: 1)红黑树就是一种高度平衡的二叉搜索树&#xff0c;但是在每一个节点上面都增加了一个存储位来表示结点的颜色&#xff0c;可以是红色或者是黑色&#xff0c;通过对任何一条从根节点到叶子节点上面的路径各个节点着色方式的限制&#xff0c;红黑…

【LeetCode热题100】--283.移动零

283.移动零 使用双指针&#xff1a; class Solution {public void moveZeroes(int[] nums) {if(nums null){return ;}int j 0;for(int i 0;i<nums.length;i){//当前元素不为0时&#xff0c;就把其交换到左边&#xff0c;等于0的交换到右边if(nums[i] ! 0){int tmp nums…

在华为云服务器上安装单机版Redis

https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉&#xff0c;点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装包…

4795-2023 船用舱底水处理装置 学习记录

声明 本文是学习GB-T 4795-2023 船用舱底水处理装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了船用舱底水处理装置(以下简称处理装置)中舱底水分离器(以下简称分离器)和舱底 水报警装置(以下简称报警装置)的要求、试验方法…