每日一题
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 <= 1000
s[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 <= 1012
1 <= 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至少,可恶