【2311. 小于等于 K 的最长二进制子序列】贪心

class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.longestSubsequence("1001010",5));
    }
    public int longestSubsequence(String s, int k) {
           int deleted = 0;
           char[] arr = s.toCharArray();
           int i = 0;
           while(i< arr.length  ){

               if(smaller(arr,k)){
                   break;
               }

               while(i< arr.length && arr[i] == '0' ) {
                    i++;
               }

               if( i == arr.length){
                   break;
               }

               deleted++;
               arr[i] = '0';
               i++;
           }
           return s.length() - deleted;
    }

    public boolean smaller(char[] arr,int k){
        int len  = arr.length - 1 ;
        for (int i = len; i >=31; i--) {
            int pos = len - i;

            if(arr[pos] == '1'){
                return false;
            }
        }
        int ans = 0;
        int x = Math.min(30,len);
        for(int i = x;i>=0;i--){
            ans +=  (1<<i)*(arr[len-i]-'0');
        }
        return ans <= k;
    }
}

 

posted @ 2022-06-22 15:57  fishcanfly  阅读(42)  评论(0)    收藏  举报
//雪花飘落效果