算法学习——引导题(函数、循环)

第一题
在这里插入图片描述
首先,看特殊数字 0 反转两次为零,即num == 0 应返回true
此外,反转两次得到原数字,说明符合要求的数字反转后位数不能改变,也即末尾没不应有零,即num % == 0 应返回false;

class Solution {
public:
    bool isSameAfterReversals(int num) {
        
        return !num || num % 10;
    }
};

第二题

在这里插入图片描述
首先,考虑特殊数字 n 为 2 的幂次方 ,必须应当大于等于零,因此当 n 小于等于零时应返回false
此外,当 n 为 1 时,是 2 的零次方,返回true
另外,当 n 为奇数是必然不肯能是 2 的幂次方, 即 num % 2 == 1;返回 false
最后,通过枚举 2 的所有幂,如出现num值则返回true

注意: k 值应当定义成无符号整型,否则当 i = 31 是会溢出
警告:整型的位数是32位,-231 <= n <= 231 - 1

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

第三题
在这里插入图片描述
首 先,直接忽略条件算一波,但是注意上下界从 1 开始 到 target 结束 包含 target
第二种方法 是利用递归 ,但不允许使用选择语句和三目运算符,考虑使用逻辑运算符模拟短路
递归思路:要算1 累加到 target 可以先算 target + (target - 1),建立递归表达式,然后注意递归截止的条件 target 为零时开始 逆序返回 target += 0; target += 1 + 0; ………… target += (target - 1)+ ……+ 1 + 0;


class Solution {
public:
    int mechanicalAccumulator(int target) {
        int sum = 0;
        // for(int i = 1; i <= target; i++)
        // {
        //     sum += i;
        // }
        // return sum;

        target && (target += mechanicalAccumulator(target -1));
        return target; 
    }
};

第四题
在这里插入图片描述

class Solution {
public:
    int kthFactor(int n, int k) {
        int cnt = 0;//定义一个计数器
        for(int i = 1; i <= n; i++)// n 为正整数 0 不可能为其因子,从 1 开始,最大为其自身[1, n];
        {
            if(n % i == 0)// 如果为真表示 i 是 n 的因子
                cnt++;
            if(k == cnt)
                return i;
        }
        return -1;//如果没有累加至 k 返回 -1
    }
};

第五题
在这里插入图片描述

class Solution {
public:
    bool isPerfectSquare(int num) {
        // //偏要使用库函数
        // int x = (int)sqrt(num);
        // return x * x == num;//如果开根号取整后,乘积仍为原数,则是完全平方数

        // //暴力枚举
        // long long n;
        // int i;
        // for(i = 1;i <= num ; i++){//枚举所有整数的平方,缩小范围 i ∈[1, num]
        //     n = (long long) i * i;//将 n 定义为 long long 防止32位整型溢出
        //     if(n == num)
        //         return true;
        //     if(n > num)
        //         return false;
        // }
        // return false;

        //二分查找
        //缩小范围 i ∈[1, num)
        int left = 0; 
        int right = num;
        while(left <= right)//终止条件left > right
        {
            int mid = (right + left) / 2;
            long long square = (long long) mid * mid; //防止溢出
            if(square < num) //如果中间值平方小于num说明在右区间,需要调整左端点的值
            {
                left = mid + 1;
            }
            else if(square > num)//如果中间值平方大于num说明在右区间,需要调整右端点的值
            {
                right = mid - 1;
            }
            else
            {
                return true;
            }
        }
        return false;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值