【解题报告】《九日集训》(第二天)

语言:C++

今天一直在外边,晚上洗漱完补的题解

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

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

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

示例 1:

输入: n = 3
输出: 6

写了一个递归

递归注意事项:要有退出条件

class Solution
{
public:
    int sumNums(int n)
    {
        if (n == 1)
            return 1;
        return n + sumNums(n - 1);
    }
};

231. 2 的幂

231. 2 的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。

示例 1:

输入:n = 1
输出:true
解释:20 = 1

法一

特判n<=0的情况

2的幂有一个特点:二进制中只有一位为1

class Solution 
{
public:
    bool isPowerOfTwo(int n) 
    {
        if (n <= 0)
            return false;
        int sum = 0;
        while (n)
        {
            if (n & 1)
                sum++;
            n >>= 1;
        }
        return sum == 1 ? true : false;
    }
};

法二

2的幂的特点:n&(n-1)==0

class Solution 
{
public:
    bool isPowerOfTwo(int n) 
    {
        return n > 0 && (n & (n - 1)) == 0;
    }
};

326. 3 的幂

326. 3 的幂

给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x

示例 1:

输入:n = 27
输出:true

依旧是一个递归

这个递归比较特殊:(n % 3)==0?isPowerOfThree(n / 3):false;

当n%3==0时,才进行下一步递归,否则返回false

退出条件同上题

class Solution 
{
public:
    bool isPowerOfThree(int n) 
    {
        if (n <= 0)
            return false;
        if (n == 1)
            return true;
        return (n % 3)==0?isPowerOfThree(n / 3):false;
    }
};

342. 4的幂

342. 4的幂

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

示例 1:

输入:n = 16
输出:true

法一

直接套上一题的模板

class Solution
{
public:
    bool isPowerOfFour(int n)
    {
        if (n <= 0)
            return false;
        if (n == 1)
            return true;
        return (n % 4) == 0 ? isPowerOfFour(n / 4) : false;
    }
};

法二

在2的幂(法二)的基础上(4的幂也是2的幂)增加了一个条件n & 0xaaaaaaaa==0

0xaaaaaaaa格式是1010 1010 1010 1010(从右至左:偶数位为1)

4的幂是 (从右至左:奇数位为1) eg.1 100 10000

class Solution
{
public:
    bool isPowerOfFour(int n)
    {
        return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
    }
};

1492. n 的第 k 个因子

1492. n 的第 k 个因子

给你两个正整数 n 和 k 。

如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。

考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。

示例 1:

输入:n = 12, k = 3
输出:3
解释:因子列表包括 [1, 2, 3, 4, 6, 12],第 3 个因子是 3 。

对于标记数k,每当n%i0,执行k–,当k0时,即此时的i为第k个因子

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

367. 有效的完全平方数

367. 有效的完全平方数

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

进阶:不要 使用任何内置的库函数,如 sqrt 。

示例 1:

输入:num = 16
输出:true

二分法查找完全平方数

注意:为了避免溢出,tmp取long类型

class Solution 
{
public:
    bool isPerfectSquare(int num) 
    {
        int left = 1;
        int right = num;
        int mid;
        long tmp;
        while (left <= right)
        {
            mid = left + (right - left) / 2;
            tmp =(long) mid * mid;
            if (tmp == num)
                return true;
            else if (tmp > num)
                right = mid - 1;
            else
                left = mid + 1;
        }
        return false;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值