Leetcode 剑指Offer

Leetcode 剑指Offer_第1张图片

求 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)。

Leetcode 剑指Offer_第2张图片

二、分析

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

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

Leetcode 剑指Offer_第3张图片

你可能感兴趣的:(【Letcode】每日一题,leetcode,算法,C++,C语言)