每日一题
1016. 子串能表示从 1 到 N 数字的二进制串
难度中等122收藏分享切换为英文接收动态反馈
给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 ,就返回 true,否则返回 false 。
子字符串 是字符串中连续的字符序列。
示例 1:
输入:s = "0110", n = 3 输出:true
示例 2:
输入:s = "0110", n = 4 输出:false
提示:
1 <= s.length <= 1000s[i]不是'0'就是'1'1 <= n <= 109
通过次数24,037提交次数37,972
很开心,没有要用kmp算法
要是用了,我还得去搞一会,难搞
思路很简单,就是枚举一遍,把数变成二进制
让后用bf(暴力匹配)搞定
数据量小,还是舒服的
bool queryString(char * s, int n){
    for(int kl=1;kl<=n;kl++){
       char b[50];
       int hj=0;
       int j=kl;
       while(j!=0){
           int k=j%2;
           j=j/2;
           b[hj]=k+48;
           hj++;
       }
       int g=0;
       
       for(int h=0;h<strlen(s);h++){
           int k=h;
           int hg=hj;
            while(hg!=0){
                if(s[k]==b[hg-1]){
                    k++;
                    hg--;
                }
                else{
                    break;
                }         
            }
            if(hg==0){
               g=1; 
               break;
            }
       }
       
       if(g==0){
       return false;
       }      
 
    }
   return true;
} 
不长但是循环好多,写起来不长但是烦的呀,可恶
还有就是细心,不要在细节上出错了,不好查,思路没问题就不要代码出问题
下次写的时候要写注释了
2457. 美丽整数的最小增量
难度中等23收藏分享切换为英文接收动态反馈
给你两个正整数 n 和 target 。
如果某个整数每一位上的数字相加小于或等于 target ,则认为这个整数是一个 美丽整数 。
找出并返回满足 n + x 是 美丽整数 的最小非负整数 x 。生成的输入保证总可以使 n 变成一个美丽整数。
示例 1:
输入:n = 16, target = 6 输出:4 解释:最初,n 是 16 ,且其每一位数字的和是 1 + 6 = 7 。在加 4 之后,n 变为 20 且每一位数字的和变成 2 + 0 = 2 。可以证明无法加上一个小于 4 的非负整数使 n 变成一个美丽整数。
示例 2:
输入:n = 467, target = 6 输出:33 解释:最初,n 是 467 ,且其每一位数字的和是 4 + 6 + 7 = 17 。在加 33 之后,n 变为 500 且每一位数字的和变成 5 + 0 + 0 = 5 。可以证明无法加上一个小于 33 的非负整数使 n 变成一个美丽整数。
示例 3:
输入:n = 1, target = 1 输出:0 解释:最初,n 是 1 ,且其每一位数字的和是 1 ,已经小于等于 target 。
提示:
1 <= n <= 10121 <= target <= 150- 生成的输入保证总可以使 
n变成一个美丽整数。 
1,我的思路很是简单就是向上枚举,但是代码又丑又长,难搞
最要命的是时间超限了,好家活白写了折磨长
换个思路,从别的方向看,
一下就发现了奥妙
1.其实你会发现,我们只要进位就可能会满足条件
 如 16 4
 这组 往上加 17 18 19都是没有意义的
那个位归0直接进位20才有可能满足
每一位上的和才有可能满足条件
要是进位了,不满足就继续往后进
如 9234 1这个
 我们先 9240不满足 //个位归零进
 9300不满足 //十位归零进
 10000就一定会满足的 //百位归零进
 我们就没有必要去对中间的任何的模拟了
 直接进位的跳,最多不会超过12次(应该是12次)
 最后用你得到的满足条件的数去减去n,就可以得到答案的
 注意:在开始进位之前先要判断不进位是否满足条件
 如 1是直接满足的
long long makeIntegerBeautiful(long long n, int target){
     
     int b[20]={0};//先将n 转化成数组
     int k=0;
     int j;
     int ans=0;
     long long ll=n;//提前存一下,后面要减
     while(n!=0){
          b[k]=n%10;
          ans=b[k]+ans;
          k++;
          n=n/10;
     }//n变成数组,反了的,但是每必要搞正,反的一不影响结果
     if(ans<=target){ //初始的未进位的
         return 0;
     }
     else{
          for(j=0;j<k;j++){
              if(j+1==k){
                  k++;
              }
            b[j]=0; //进位
            b[j+1]++;  
          
             for(int ff=j+1;ff<k;ff++){
                    if(b[ff]>=10){
                    if(ff+1==k){
                      k++;
                    }
                       b[ff+1]++;
                        b[ff]=b[ff]%10;
                    }
             } //可能会进位 如 999 对个位归零 就变成了1000了    
       
          int sum=0;
          for(int kl=j+1;kl<k;kl++){
              sum+=b[kl];
          }//求各个位的和
          if(sum<=target){
              break;
          }//满足了直接跳出
          }
     }
     long long max=0;
     long long na=1;
     for(int l=0;l<k;l++){//把我们进位的数还原出来
         max+=b[l]*na;
         na=na*10;
     }
  
  return max-ll;//得出答案
}
 
有注释的,写完后补的,顺带在力扣写一篇题解
今天学习了java
的多态,但是学的好少(要测试了呜呜呜)
还是记笔记吧


撒花谢幕了,明天刷4至少,可恶



















