学习日记,5.8

哎呀明天要查线性代数的作业了,完蛋,今天奋起一博,连看3h的网课,可恶没有时间学习java了

但是题目还是有的,但是今天的每日一题今天是解决不了,有难度有,但不多就是代码长,容易戳

我找两个前几天的每日一题来搞一波

1003. 检查替换后的词是否有效

难度中等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的数据搞得,小问题还是容易发现得(会直接报错的)

再来一个看看

970. 强整数

难度中等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忘了赋值是没有输出的,我还以为申请内存有问题,还要看了一会题目,反应过来了

我今天早写是因为,线性代数的作业还没写完要命了,我先溜了

呜呜呜呜呜呜呜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值