【万人千题】算法解题报告11.28

1,242. 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com)

bool isAnagram(char * s, char * t)
{
    int lens=strlen(s);
    int lent=strlen(t);
    char* cnts=(char*)malloc(sizeof(char)*26);
    char* cntt=(char*)malloc(sizeof(char)*26);
    memset(cnts,0,sizeof(cnts));
    memset(cntt,0,sizeof(cntt));
    int i=0;
    while(i<lens)
    {
        int j=s[i]-'a';
        ++cnts[j];
        i++;
    }
    i=0;
        while(i<lent)
    {
        int j=t[i]-'a';
        ++cntt[j];
        i++;
    }
    for(i=0;i<26;i++)
    {
        if(cnts[i]!=cntt[i])
        return false;
    }    
    return true;
}

对于字符,想用计数排序的话就得减去’a‘,这里主要是没有大小写混合,不然就会更麻烦一点。如果有大小写,我目前的思路是开两个,然后判断,分别放进去或者可以看一下ASCII码,设计一下减去多少让他刚好在26之后。

2,215. 数组中的第K个最大元素 - 力扣(LeetCode) (leetcode-cn.com)

//解法一:
// int cmp(const void*e1,const void*e2)
// {
//     if(*(int*)e1<=*(int*)e2)
//     return 1;
//     else
//     return 0;
// }
// int findKthLargest(int* nums, int numsSize, int k)
// {
//     qsort(nums,numsSize,sizeof(int),cmp);
//     int i=0;
//     for(i=0;i<numsSize;i++)
//     {
//        if(i+1==k)
//          return nums[i];
//     }
//     return 0;
// }

//解法二:
int cnt[20001]={0};
int findKthLargest(int* nums, int numsSize, int k)
{
    memset(cnt,0,sizeof(cnt));
    int i=0;
    for(i=0;i<numsSize;i++)
    {
        ++cnt[nums[i]+10000];
    }
    int j=0;
    for(i=0;i<20001;i++)
    {
        while(cnt[i]!=0)
        {
            if(j==numsSize)
            break;
            nums[j]=i-10000;
            j++;
            cnt[i]--;
        }
    }
    //  printf("%d",nums[]);
    for(i=numsSize-1;k;k--,i--)
    {
        if(k-1==0)
        return nums[i];
    }
    return 0;
}

一开始没想到怎么解决负数的问题,用qsort做了,可以看看。解法二就是计数排序了。加上一个偏移量。也就是让最小的那个负数加上它自己的绝对值之后变成0,让每个数都加上这么一个数,再统计。注意这里只是统计的时候加,原数组的数是没有变化的。然后在放回原数组的时候在减去相同的数即可。

3,268. 丢失的数字 - 力扣(LeetCode) (leetcode-cn.com)

int missingNumber(int* nums, int numsSize)
{
     int* cnt=(int*)malloc(sizeof(int)*(numsSize+1));
    //  memset(cnt,0,sizeof(cnt));
     int i=0;
     for(i=0;i<numsSize+1;i++)
     {
         cnt[i]=0;
     }
     for(i=0;i<numsSize;i++)
     {
         ++cnt[nums[i]];
     }    
     for(i=0;i<numsSize+1;i++)
     {
         if(cnt[i]==0)
         return i;
     }   
     return 0;
}

这道题其实计数即可,可以不用排序。计数之后就可以找到丢失的数了。

4,389. 找不同 - 力扣(LeetCode) (leetcode-cn.com)

char findTheDifference(char * s, char * t)
{
      int i=0;
      int lens=strlen(s);
      int lent=strlen(t);
      for(i=0;i<lens;i++)
      {
          int j=0;
          for(j=0;j<lent;j++)
          {
              if(s[i]==t[j])
              {
                  t[j]='0';
                  break;
              }
          }
      }
     for(i=0;i<lent;i++)
     {
         if(t[i]!='0')
         return t[i];
     }
    return 0;
}

可以这样,把找得到的每个元素改掉,最后找出没改的元素,可以用计数排序

int cnt[1001]={0};
 char findTheDifference(char * s, char * t)
 {
     memset(cnt,0,sizeof(cnt));
           int i=0;
      int lens=strlen(s);
      int lent=strlen(t);
      for(i=0;i<lent;i++)
      {
          int j=t[i]-'a';
          ++cnt[j];
      }
      for(i=0;i<lens;i++)
      {
          int j=s[i]-'a';
          --cnt[j];
      }
      for(i=0;i<1001;i++)
      {
          if(cnt[i]!=0)
          return i+'a';
      }
      return 0;
 }

这种方法的运行速度会快上很多。

5,645. 错误的集合 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    int* ret=(int*)malloc(sizeof(int)*2);
    int* cnt=(int*)malloc(sizeof(int)*(numsSize+1));
    int i=0;
    for(i=0;i<numsSize+1;i++)
    {
        cnt[i]=0;
    }
    for(i=0;i<numsSize;i++)
    {
        ++cnt[nums[i]];
    }
    int a=-1,b=-1;
    for(i=1;i<numsSize+1;i++)
    {
        if(cnt[i]==2)
        a=i;
        if(cnt[i]==0)
        b=i;
        if(a!=-1&&b!=-1)
        break;
    }
    *returnSize=2;
    ret[0]=a;
    ret[1]=b;
    return ret;
}

同样计数即可,之后去计数的数组中寻找值为2和0的数,返回下标即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值