Day07——T342 4的幂、T125验证回文串

Leetcode07

T342 4的幂

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

  • 位运算

    class Solution {
    public:
        bool isPowerOfFour(int n) {
            return (n > 0) && (n & (n - 1)) == 0 && (n & 0xAAAAAAAA) ==0;
        }
    };
    
    • 4的幂需要满足2的幂的特性

    • 4的幂同时具有自己的特性,二进制中1的位置都在奇数位上

      4:100

      16:10000

    • 将4的幂中1可能出现的特征位置都填上,即为

      01010101010101010101010101010100

      10101010101010101010101010101010(0xAAAAAAAA)

      刚好4的幂有1的地方0xAAAAAAAA都为0,即位运算为0

  • 暴力求解(循环代替递归防止超出时间限制)

    class Solution {
    public:
        bool isPowerOfFour(int n) 
        {
            long i=4,a=1;
            if(n==1) return true;
            while(pow(i,a)<pow(2,31)-1)//题目条件范围限制
            {
                if(pow(i,a)==n)
                {
                    return true;
                }
                a++;
            }
            return false;
        }
    };
    
    • pow函数

      #include<cmath> //必要头文件
      pow(x,y); //x的y次方
      一般来说的正确用法是pow(int,double)
      如:pow(2,2.0)
      

T125验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

准备前提:对字符串 s 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串sgood

  • 字符串翻转API(c++:)

    class Solution {
    public:
        bool isPalindrome(string s) {
            string sgood;
            for (char ch: s) {
                if (isalnum(ch)) {//
                    sgood += tolower(ch);
                }
            }
            string sgood_rev(sgood.rbegin(), sgood.rend());
            return sgood == sgood_rev;
        }
    };
    
    • 增强for循环

      for(声明语句 : 表达式)
      {
         //代码句子
         //声明语句:声明新的局部变量,与数组元素的类型匹配,用作输出或传值
         //表达式:访问的数组名
      }
      for (char ch: s)
      
    • isalnum()函数

      判断一个字符是否是字母或者(十进制)数字,若为字母或者数字,则返回True(非0值),否者返回False(0)
      int isalnum (int c)
      #include<cctype>//头文件
      
    • tolower()函数

      将给定字符转换为小写
      tolower(int ch);//语法
      #include<cctype>//头文件
      
    • std::string中的反向迭代器rbegin()、rend()

      rbegin():表示string字符串的倒数第一个字符
      rend():表示string字符串的正数第一个字符
      string sgood_rev(sgood.rbegin(), sgood.rend());//string类使用
      
  • 双指针(头尾进位比较)

    class Solution {
    public:
        bool isPalindrome(string s) {
            string sgood;
            for (char ch: s) {
                if (isalnum(ch)) {
                    sgood += tolower(ch);
                }
            }
            int n = sgood.size();//string函数
            int left = 0, right = n - 1;
            while (left < right) {
               if (sgood[left] != sgood[right]) {
                    return false;
                }
                ++left;
                --right;
            }
            return true;
        }
    };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值