哎呀明天要查线性代数的作业了,完蛋,今天奋起一博,连看3h的网课,可恶没有时间学习java了
但是题目还是有的,但是今天的每日一题今天是解决不了,有难度有,但不多就是代码长,容易戳
我找两个前几天的每日一题来搞一波
难度中等132收藏分享切换为英文接收动态反馈
给你一个字符串 s
,请你判断它是否 有效 。
字符串 s
有效 需要满足:假设开始有一个空字符串 t = ""
,你可以执行 任意次 下述操作将 t
转换为 s
:
- 将字符串
"abc"
插入到t
中的任意位置。形式上,t
变为tleft + "abc" + tright
,其中t == tleft + tright
。注意,tleft
和tright
可能为 空 。
如果字符串 s
有效,则返回 true
;否则,返回 false
。
示例 1:
输入:s = "aabcbc" 输出:true 解释: "" -> "abc" -> "aabcbc" 因此,"aabcbc" 有效。
示例 2:
输入:s = "abcabcababcc" 输出:true 解释: "" -> "abc" -> "abcabc" -> "abcabcabc" -> "abcabcababcc" 因此,"abcabcababcc" 有效。
示例 3:
输入:s = "abccba" 输出:false 解释:执行操作无法得到 "abccba" 。
提示:
1 <= s.length <= 2 * 104
s
由字母'a'
、'b'
和'c'
组成
看了一会发现和之前写的,一个匹配括号的题目有点像,不对是基本上一样的
看题后,你要拼出s一个一个的插入,其实就是abc是一个完整的括号,把a和b入栈
发现了c就从栈里面搞两个元素出来,要是分别是b,a的话就证明这一括号没问题的
继续遍历,有问题就直接break,最后还要检查栈里面是否空了
上码
bool isValid(char * s){
char stact[200001]={0};
int kl=0;
int j;
for(j=0;j<strlen(s);j++){
if(s[j]=='a'||s[j]=='b'){
stact[kl]=s[j];
kl++;
}
if(s[j]=='c'){
kl--;
if(kl<0){
return false;}
char x1=stact[kl];
printf("%c\n",x1);
kl--;
if(kl<0){
return false;}
char x2=stact[kl];
printf("%c\n",x2);
if(x1=='b'&&x2=='a'){
printf("11111");
continue;
}
else{
break;
}
}
}
if(j==strlen(s)&&kl==0){
return true;
}
else{
return false;
}
}
还有就是,要是栈负了,直接返回false
那是只有c没有a和b的数据搞得,小问题还是容易发现得(会直接报错的)
再来一个看看
难度中等102收藏分享切换为英文接收动态反馈
给定三个整数 x
、 y
和 bound
,返回 值小于或等于 bound
的所有 强整数 组成的列表 。
如果某一整数可以表示为 xi + yj
,其中整数 i >= 0
且 j >= 0
,那么我们认为该整数是一个 强整数 。
你可以按 任何顺序 返回答案。在你的回答中,每个值 最多 出现一次。
示例 1:
输入:x = 2, y = 3, bound = 10 输出:[2,3,4,5,7,9,10] 解释: 2 = 20 + 30 3 = 21 + 30 4 = 20 + 31 5 = 21 + 31 7 = 22 + 31 9 = 23 + 30 10 = 20 + 32
示例 2:
输入:x = 3, y = 5, bound = 15 输出:[2,4,6,8,10,14]
提示:
1 <= x, y <= 100
0 <= bound <= 106
我想了挺多的没想到这题目,c语言是可以暴力破解的
可以暴力加上hash数组直接解决,但是很显然题目的初中不是想让你这样的
hash数组也不开太大,记录每个小于bound的值即可,有就加入答案数组
所以要有一些的注意事项
比如幂指数的运算,long long 是一定要的
2的20次方就已经超出了边界了,要及时break,后面的数据太大了,溢出了
但是及时的break还是不可以避免少量的溢出,对于判断要加一个大于0的条件,溢出的负数据直接排除即可,就可ac了
上代码
int* powerfulIntegers(int x, int y, int bound, int* returnSize){
int a[1000001]={0};
int* ans=(int*)malloc(sizeof(int)*1000001);
memset(ans,0,sizeof(ans));
int op=0;
for(int h=0;h<20;h++){
for(int j=0;j<20;j++){
long long y1=pow(x,h);
if(y1>bound){
break;
}
long long y2=pow(y,j);
if(y2>bound){
break;
}
long long jk=y1+y2;
if(jk>=0&&jk<=bound){
a[jk]++;
}
else{
break;
}
}
}
for(int kj=1;kj<=bound;kj++){
if(a[kj]!=0){
ans[op]=kj;
printf("%d\n",ans[op]);
op++;
}
}
*returnSize=op;
return ans;
}
还有一点小事,returnsize忘了赋值是没有输出的,我还以为申请内存有问题,还要看了一会题目,反应过来了
我今天早写是因为,线性代数的作业还没写完要命了,我先溜了
呜呜呜呜呜呜呜