【学习记录】《LeetCode零基础指南》(第2讲) 循环

本文深入探讨了几种算法问题的解决方法,包括利用递归计算1到n的和、判断2、3、4的幂以及n的第k个因子。此外,还介绍了如何确定一个数是否为完全平方数。这些方法巧妙地避免了使用乘除法、循环和条件语句,展示了算法设计的灵活性。
摘要由CSDN通过智能技术生成


前言

今日开始刷算法,今日内容:函数。


做题记录

求1+2+…+n

  1. 剑指 Offer 64. 求1+2+…+n

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

分析思路:不用循环,要实现目的或许可以用递归,以下为递归代码
代码如下(示例):

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

力扣截图


2 的幂

  1. 231. 2 的幂

解题思路:
1、目标值若为2的幂一定可以被2整除,不能则直接输出false
2、此数不断除2最终(倒数第二次,最后一次就整除了)一定为2才能为true
代码如下(示例):

bool isPowerOfTwo(int n){
    if(n==1 || n==2) return true;
    if( n>2 && n%2==0)
        return isPowerOfTwo( n>>1 );
    return false;
}

在这里插入图片描述

解题思路2:
1、若果n<=0,必然不是2的幂
2、1必然为2的零次幂
3、枚举所有的幂(2、4、8、…、2^31)
4、一旦找到与n相等的,返回true
5、当枚举数超过n的大小时返回false(减少比较次数,不用每次都算到最后),说明不是2的幂
代码如下(示例):

bool isPowerOfTwo(int n){
	int i;
	unsigned int k = 1;
	if(n <= 0){
		return false;
	}
	if(n == 1){
		return true;
	}
	for(i=1 ; i<=31; i++){
		k *= 2;
		if(k == n){
			return true;
		}
		if(k > n){
			return false;
		}
	}
    return false;
}

3 的幂

  1. 326. 3 的幂

解题思路:
1、目标值若为3的幂一定可以被3整除,不能则直接输出false
2、此数不断除3最终(倒数第二次,最后一次就整除了)一定为3才能为true
代码如下(示例):

bool isPowerOfThree(int n){
    if(n==1 || n==3) return true;
    if( n>3 && n%3==0)
        return isPowerOfThree( n/3 );
    return false;
}

在这里插入图片描述

解题思路2:
1、和上题类似,但枚举只需要到20次方,因为3^21超过32位整形上限了
2、枚举值为1、3、9、…、3^20,所以k不断*3
代码如下(示例):

bool isPowerOfThree(int n){
	int i;
	unsigned int k = 1;
	if(n <= 0){
		return false;
	}
	if(n == 1){
		return true;
	}
	for(i=1 ; i<=20; i++){
		k *= 3;
		if(k == n){
			return true;
		}
		if(k > n){
			return false;
		}
	}
    return false;
}

4的幂

  1. 342. 4的幂

解题思路:
1、目标值若为4的幂一定可以被4整除,不能则直接输出false
2、此数不断除4最终(倒数第二次,最后一次就整除了)一定为3才能为true
代码如下(示例):

bool isPowerOfFour(int n){
    if(n==1 || n==4) return true;
    if( n>4 && n%4==0)
        return isPowerOfFour( n/4 );
    return false;
}

在这里插入图片描述

解题思路2:
1、和上题类似,但枚举只需要到15次方,因为4^16超过32位整形上限了
2、枚举值为1、4、16、…、4^15,所以k不断*4
代码如下(示例):

bool isPowerOfFour(int n){
	int i;
	unsigned int k = 1;
	if(n <= 0){
		return false;
	}
	if(n == 1){
		return true;
	}
	for(i=1 ; i<=15; i++){
		k *= 4;
		if(k == n){
			return true;
		}
		if(k > n){
			return false;
		}
	}
    return false;
}

n 的第 k 个因子

  1. 1492. n 的第 k 个因子

题目描述:给你两个正整数 n 和 k 。如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。

解题思路:
定义一个计数用变量
1、枚举所有在1~n的数,一旦满足条件计数器加一
2、一旦枚举目标值到达k次,则说明找到了,返回枚举到的数
3、如果枚举到最后都没有,则说明不存在第k个因子,此时返回-1;
代码如下(示例):

int kthFactor(int n, int k){
    int i;
    int temp = 0;
    for(i = 1; i <= n; i++){
        if(n % i == 0){
            temp++;
            if(temp == k){
                return i;
            }
        }
    }
    return -1;
}

在这里插入图片描述


完全平方数

  1. 367. 有效的完全平方数

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。

解题思路:
递推公式为 n² = 1 + 3 + 5 + … + 2n − 1
1、从1~num不断进行完全平方数枚举;
2、如果某次运算之后平方数=num,说明找到目标值,输出true;
3、若此时枚举的完全平方数已经超过num,则说明次数不是完全平方数,返回false;
4、补充:因题库的测试用例会超出32位,所以枚举数的变量至少需要使用long int才能通过才使用例;
代码如下(示例):

bool isPerfectSquare(int num){
    int i = 1;
    long int sum = 0;
    while(i <= num){
        sum += i;
        if(sum == num)
            return true;
        if(sum > num)
            return false;
        i += 2;
    }
    return false;
}

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值