九日集训第二天《循环》

文章目录

今日知识总结

  1. 循环:循环初始表达式,循环条件表达式,循环执行表达式
  2. 初始表达式:初始化表达式外置,初始化表达式内置
  3. 条件表达式:表明结束循环的条件
  4. 执行表达式:让循环逐渐不成立,可以省略,代码块里本身也可以加上此功能

题目分析

  1. num剑指 Offer 64. 求1+2+…+n
    • 题目链接:剑指 Offer 64. 求1+2+…+n

    • 思路: 根据题目要求很容易就可以想到递归的方式,但是递归的时候我们也会用到逻辑运算符,怎么样来规避逻辑运算符的应用呢,可以运用到逻辑运算符的短路性质,比如说||运算符,如果前面为true,我们就可以直接返回true,不必再判断下一个条件了,那么同理,这道题可以用&&进行判断

    • 代码

      class Solution {
      public:
          int sumNums(int n) {
              n && (n += sumNums(n - 1));
              return n;
      
          }
      };
      
  2. num231. 2 的幂

    • 题目链接:(https://leetcode-cn.com/problems/power-of-two/)

    • 思路:找出i = 0开始计算2i次幂,知道2^i >= n 为止

    • 代码:

      long long pow(int n){
          long long ans = 1;
          int old = n;
          long long a = 2;
          while(old){
              if(old % 2 == 1) ans *= a;
              old /= 2;
              a *= a;
          }
          return ans;
      
      }
      
      class Solution {
      public:
          bool isPowerOfTwo(int n) {
              if(n == 1) return true;
              for(int i = 0; i < n; i ++){
                  if(n == pow(i)) return true;
                  else if(n < pow(i)) return false;
              }
      
              // cout << pow(5);
              return false;
          }
      };
      
  3. 326. 3 的幂

    • 题目链接:https://leetcode-cn.com/problems/power-of-three/

    • 思路:试除法,将 n % 3,如果等于0,就将 n / 3,如果有余数,就可以直接返回false

    • 代码:

      class Solution {
      public:
          bool isPowerOfThree(int n) {
              while(n && (n % 3 == 0)){
                  n /= 3;
              }
              return n == 1;
          }
      };
      
  4. num342. 4的幂

    • 题目链接:https://leetcode-cn.com/problems/power-of-four/

    • 思路:从1开始不断乘4,与n比较,如果这个数> n仍然没有返回true,则返回false,注意1要进行特殊判断

    • 代码

      class Solution {
      public:
          bool isPowerOfFour(int n) {
      
              if(n <= 0) return false;
              if(n == 1) return true;
              long long a = 1;
              while(a <= n){
                  a *= 4;
                  if(a == n) return true;
              }
              return false;
      
          }
      };
      
  5. 1492. n 的第 k 个因子

    • 题目链接:https://leetcode-cn.com/problems/the-kth-factor-of-n/

    • 思路:求因数,遍历一遍与i 取模即可,

    • 代码:

      class Solution {
      public:
          int kthFactor(int n, int k) {
              // map<int, int> a;
              // int max = 1;
              // for(int i = 1; i <= n; i++){
              //     if(n % i == 0) {
              //         a[max] = i;
              //         max++;
              //     }
              // }
              // cout << max;
      
              // if(max - 1 < k) return -1;
              // else return a[k];
      
              int cnt = 0;
              for(int i = 1; i <= n; i++){
                  if(n % i == 0){
                      cnt++;
                      if(cnt == k) return i;
                  }
              }
      
              return -1;
      
          }
      };
      
  6. 367. 有效的完全平方数

    • 题目链接:https://leetcode-cn.com/problems/valid-perfect-square/

    • 思路:

      • 列出找出比num小的数的平方
      • 1 = 1; 4 = 1 + 3; 9 = 1 + 3 + 5; 16 = 1 + 3 + 5 + 7 + 9;
      • 由此可知,只要不断减去奇数,知道n <= 0
    • 代码:

    • class Solution {
      public:
          bool isPerfectSquare(int num) {
              long long i = 0;
              while(i <= num){
                  if(i > num) break;
                  if(i * i == num) return true;
                  i++;
              }
              return false;
      
          }
      };
      //这个在超时边缘徘徊,尽量不考虑
      class Solution {
      public:
          bool isPerfectSquare(int num) {
              int i = 1;
              while(num > 0){
                  num -= i;
                  i += 2;
              }
              return num == 0;
      
          }
      };
      
      

今日收获:

  1. 逻辑运算符的短路性质
  2. 完全平方数的规律

今日疑问:

  1. 有些地方感觉可以使用二分查找,感觉可以拿来练一下,二的幂之类的,等练习二分时候,感觉可以回头做一下

资料链接

博客链接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值