1.
1023. 驼峰式匹配
难度中等107收藏分享切换为英文接收动态反馈
如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)
给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false。
示例 1:
输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FB" 输出:[true,false,true,true,false] 示例: "FooBar" 可以这样生成:"F" + "oo" + "B" + "ar"。 "FootBall" 可以这样生成:"F" + "oot" + "B" + "all". "FrameBuffer" 可以这样生成:"F" + "rame" + "B" + "uffer".
示例 2:
输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBa" 输出:[true,false,true,false,false] 解释: "FooBar" 可以这样生成:"Fo" + "o" + "Ba" + "r". "FootBall" 可以这样生成:"Fo" + "ot" + "Ba" + "ll".
示例 3:
输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBaT" 输出:[false,true,false,false,false] 解释: "FooBarTest" 可以这样生成:"Fo" + "o" + "Ba" + "r" + "T" + "est".
看题一会,出现不匹配的原因就两种情况
1,有多余的大写字母,匹配不到
2,匹配完了,pattern还未全匹配到
有以上的条件,直接开搞
bool* camelMatch(char ** queries, int queriesSize, char * pattern, int* returnSize){
          int sum=0;
          int h=strlen(pattern);
          *returnSize=queriesSize;
          bool* ans=(bool*)malloc(sizeof(1)*queriesSize);
          for(int j=0;j<queriesSize;j++){
              ans[j]=true;
               int i=0;
                int m;
               for(m=0;queries[j][m]!='\0';m++){
                    if(queries[j][m]<'a'){
                         if(queries[j][m]==pattern[i]&&i<h)
                         i++;
                         else{
                             ans[j]=false;
                            break;
                         }
                    }
                    else{
                       if(queries[j][m]==pattern[i]&&i<h)
                         i++; 
                    }
               }
               if(i<h){
                   ans[j]=false;
               }
            
     
          }
          return ans;
}自己定义内存,有点变扭,不常写,哎呀,但是对指针的理解,还有底层的理解直接大大的提升.呀
ok next one
506. 相对名次
难度简单207收藏分享切换为英文接收动态反馈
给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。
运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:
- 名次第 1的运动员获金牌"Gold Medal"。
- 名次第 2的运动员获银牌"Silver Medal"。
- 名次第 3的运动员获铜牌"Bronze Medal"。
- 从名次第 4到第n的运动员,只能获得他们的名次编号(即,名次第x的运动员获得编号"x")。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。
示例 1:
输入:score = [5,4,3,2,1] 输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"] 解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。
示例 2:
输入:score = [10,3,8,9,4] 输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"] 解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。
提示:
- n == score.length
- 1 <= n <= 104
- 0 <= score[i] <= 106
- score中的所有值 互不相同
没啥技巧
对数组的值用枚举给他们一个排名
随后根据排名来,给字符串赋值
难点就是,要自己开二维数组
char ** findRelativeRanks(int* score, int scoreSize, int* returnSize){
       char** ans=(char**)malloc(sizeof(char*)*scoreSize);
       char * jk=(char*)malloc(sizeof(char)*20*scoreSize);
        int ansr[50000]={0};
        *returnSize=scoreSize;
         for(int h=0;h<scoreSize;h++)
             ans[h]=&jk[h*20]; 
        for(int h=0;h<scoreSize;h++){
            int sum=1;
           for(int j=0;j<scoreSize;j++){
              if(score[h]<score[j])
              sum++;
           }
           ansr[h]=sum;
        }
        for(int b=0;b<scoreSize;b++){
            if(ansr[b]==1)
                strcpy(ans[b],"Gold Medal");
            else if(ansr[b]==2)
                strcpy(ans[b],"Silver Medal");
            else if(ansr[b]==3)
                 strcpy(ans[b],"Bronze Medal");
            else
                 sprintf(ans[b], "%d",ansr[b]);
        }
        return ans;
}ok next one
1334. 阈值距离内邻居最少的城市
难度中等96收藏分享切换为英文接收动态反馈
有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。
返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为 distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。
注意,连接城市 i 和 j 的路径的距离等于沿该路径的所有边的权重之和。
示例 1:

输入:n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4 输出:3 解释:城市分布图如上。 每个城市阈值距离 distanceThreshold = 4 内的邻居城市分别是: 城市 0 -> [城市 1, 城市 2] 城市 1 -> [城市 0, 城市 2, 城市 3] 城市 2 -> [城市 0, 城市 1, 城市 3] 城市 3 -> [城市 1, 城市 2] 城市 0 和 3 在阈值距离 4 以内都有 2 个邻居城市,但是我们必须返回城市 3,因为它的编号最大。
示例 2:

输入:n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distanceThreshold = 2 输出:0 解释:城市分布图如上。 每个城市阈值距离 distanceThreshold = 2 内的邻居城市分别是: 城市 0 -> [城市 1] 城市 1 -> [城市 0, 城市 4] 城市 2 -> [城市 3, 城市 4] 城市 3 -> [城市 2, 城市 4] 城市 4 -> [城市 1, 城市 2, 城市 3] 城市 0 在阈值距离 2 以内只有 1 个邻居城市。
提示:
- 2 <= n <= 100
- 1 <= edges.length <= n * (n - 1) / 2
- edges[i].length == 3
- 0 <= fromi < toi < n
- 1 <= weighti, distanceThreshold <= 10^4
- 所有 (fromi, toi)都是不同的。
用邻间矩阵存边,再用floyed算法得到全部得最短路
枚举一遍得到每个城市可以到达另外的城市的数目
再枚举一遍,得到最少得,要用<=的条件(要求城市的编号最大)
上代码
int findTheCity(int n, int** edges, int edgesSize, int* edgesColSize, int distanceThreshold){
       int a[n][n];
      
      memset(a,10001,sizeof(int)*(n*n));
      for(int j=0;j<edgesSize;j++){
          a[edges[j][0]][edges[j][1]]=edges[j][2];
          a[edges[j][1]][edges[j][0]]=edges[j][2];
      }
       for(int h=0;h<n;h++)
        for(int b=0;b<n;b++)
          for(int g=0;g<n;g++){
               a[b][g]=fmin(a[b][g],a[b][h]+a[h][g]);
               }
         int ans[n];
        memset(ans,0,sizeof(int)*n);
       for(int j=0;j<n;j++){
             for(int k=0;k<n;k++){
                    if(a[j][k]<=distanceThreshold&&j!=k){
                        ans[j]++;
                    }
             }
       }
       int minr=0;
       int mine=ans[0];
        for(int h=1;h<n;h++){
            if(mine>=ans[h]){
                mine=ans[h];
                minr=h;
            }
        }
    return minr;
}其它的水题就不写了
今天,撒花谢幕,可恶明天力扣有竞赛好像,第一次打
哎呀!!!



















