当前位置:网站首页>2311. 小于等于 K 的最长二进制子序列

2311. 小于等于 K 的最长二进制子序列

2022-07-05 08:57:00 紫菜(Nori)

思路:

1.从右到左,寻找大于最大值的下标点

2.如果有剩余字符,只记录,为0的字符个数

class Solution {
public:
    int longestSubsequence(string s, int k) {
        int ans = 0;
        
        // 记录当前总消息
        long sum = 0;

        // 倒序遍历元素,方便直接从右开始计算数字和
        int len = s.size() - 1;
        int i = len;
        for(; i >= 0; i--){
          // 当前位数的2的幂次
          int bit = len - i;
          
          if(s[i] == '0'){
            // 如果当前的幂次所表示的数字,超过k,则可以直接返回,防止后面出现数字溢出问题
            if(k < (sum + pow(2, bit))){
              break;
            }
            
            // 否则继续
            continue;
          }
          
          // 如果当前字符为1,则表示可以累加记数
          // 当已经累加的数字 > k是跳出循环,当前的i保留在这个位置
          if(k < (sum += pow(2, bit))){
            break;
          }
        }
      
        // 这个字符串表示的数字完全符合
        if(i == -1){
          return s.size();
        }
      
        // 从右到左,已经符合的长度,
        ans = len - i;
      
        // 由于表示的数字已经到达极限,这里只记录为零的字符即可
        for(; i >= 0; i--){
          if(s[i] == '1'){
            continue;
          }
          
          ans++;
        }
      
        return ans;
    }
};

原网站

版权声明
本文为[紫菜(Nori)]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_36790074/article/details/125589112