《九日集训》第15轮 第二天(第二讲)循环

知识点

循环

for(循环初始化表达式; 循环条件表达式; 循环执行表达式){
    循环体
}

题目分析

题目1

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

分析

题目要求不能使用循环,首先写出

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

因为题目要求不能用条件表达式,仔细分析一下代码开源发现当\(n<1\)时,\(n\)不变,只有当\(n>1\)的时候,\(n\)才会等于\(n+sumNums(n-1)\)。然后就想到了可以用\(\&\&\)的短路性,

也就是\(n>1\&\&(n=sumNums(n-1))\)

代码

class Solution {
public:
    int sumNums(int n) {
        bool sum=(n>1)&&(n=n+sumNums(n-1));
        return n;
    }
};

题目2

231. 2 的幂

分析

这题看书的时候看过,思路是如果一个整数是2的整数次幂,那么转换成2进制的时候只有最高位是1,其他位是0,也就是说\(n\&n-1=0\),要注意\(n=0\)的特殊情况

代码

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

题目3

326. 3 的幂

分析

\(n=3^x\)可知,\(\lg n=x\lg 3\)。所以当\(n\)\(3\)的整次幂时,\(x\)一定是整数,经过测试不能直接取整,不然会卡\(243\)这个数据(呜呜呜),所以判断是否是整数的依据应该是\(|x-round(x)|<10^{-10}\)

代码

class Solution {
public:
    bool isPowerOfThree(int n) {
        if(n<=0)return false;
        double m1=log(n)/log(3);
        if(abs(m1-round(m1))<1e-10)return true;
        return false;
    }
};

题目4

342. 4的幂

分析

因为\(4^n=2^{2k}\),所以一个数是否是\(4\)的幂要满足两个条件

  1. 2的幂
  2. 完全平方数

代码

class Solution {
public:
    bool isPowerOfFour(int n) {
        if(n<=0)return false;
        int num=sqrt(n);
        if(num*num!=n)return false;
        if((n&n-1)!=0)return false;
        return true;
    }
};

题目5

1492. n 的第 k 个因子

分析

定义一个\(count\)记录因子的数量,然后从\(1\)开始枚举到\(n\),如果\(n\%i=0\)\(count++\),由于是从\(1\)开始枚举的,所以一定是升序的,如果\(count=k\),直接返回\(i\)即可,否则返回\(-1\)

代码

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

题目6

367. 有效的完全平方数

分析

二分在判断一下,把昨天那题69. x 的平方根代码改一下就可以氵过去了qwq

代码

class Solution {
public:
    bool isPerfectSquare(int num) {
        if(num==1)return true;
        int l=0,r=num;
        const double eps=1; //精度
        while(r-l>1){
            int mid=(r+l)/2;
            if(mid>num/mid) r=mid;
            else l=mid;
        }
        
        return l*l==num;
    }
};

总结

感觉今天的题目偏简单qwq
image

posted @ 2022-03-29 15:44  灰之魔女伊蕾娜  阅读(40)  评论(0)    收藏  举报