力扣错题集

一、

 哈希表:

#define MAX_SIZE 1024
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) 
{
    int* hash = (int*)calloc(MAX_SIZE, sizeof(int));
    int* res = (int*)calloc(MAX_SIZE, sizeof(int));
    for (int i = 0; i < nums1Size; i++) {
        if (hash[nums1[i]] == 0) {
            hash[nums1[i]]++;
        }
    }
    *returnSize = 0;
    for (int i = 0; i < nums2Size; i++) {
        if (hash[nums2[i]]) {
            hash[nums2[i]]--;
            res[(*returnSize)++] = nums2[i];
        }
    }
    return res;
}

排序: 

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(void* a, void* b) {
    return *(int*)a - *(int*)b;
}

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    /* 1、判断输入数组是否有空,有则返回 */
    if (!nums1 || !nums2) {
        *returnSize = 0;
        return NULL;
    }
    /* 2、对输入数组进行排序 */
    qsort(nums1, nums1Size, sizeof(int), cmp);
    qsort(nums2, nums2Size, sizeof(int), cmp);
    /* 3、定义索引cnt、分配返回数组的空间为输入数组的较小者 */
    int cnt = 0;
    int* ret = (int*)malloc(sizeof(int) * (int)fmin(nums1Size, nums2Size));
    /* 4、从头到尾进行比较 */
    for (int i = 0, j = 0; i < nums1Size && j < nums2Size; ) {
        /* 不相等则进行下一次比较 */
        if (nums1[i] < nums2[j]) {
            i++;
        }
        else if (nums1[i] > nums2[j]) {
            j++;
        }
        else {
            /* 相等则记录 */
            ret[cnt++] = nums1[i];
            i++;
            j++;
            /* 判断是否出现相等元素,减小cnt即可,这样下次记录元素时即可直接覆盖掉 */
            if (cnt > 1 && ret[cnt - 1] == ret[cnt - 2]) {
                cnt--;
            }
        }
    }
    //ret = (int *)realloc(ret, sizeof(int) * cnt);
    *returnSize = cnt;
    return ret;
}


二、

int pivotIndex(int* nums, int numsSize){
    int totalsum = 0, leftsum = 0;                      //totalsum存放整个数组元素和,leftsum存放左侧元素和
    
    for(int i=0; i<numsSize; i++){                      //计算所有元素和
        totalsum += nums[i];
    }
    
    for(int j=0; j<numsSize; j++){                      //寻找中心下标
        if(leftsum*2 == (totalsum - nums[j]))  
            return j;                        
        leftsum += nums[j];
    }
    
    return -1;                                          //无符合的返回-1
}


三、

static int answer[100000]={0};
int* productExceptSelf(int* nums, int numsSize, int* returnSize){
*returnSize = numsSize;
int i = 0;
int left[numsSize];
int right[numsSize];
left[0] = 1;
for(i=1;i<numsSize;i++)
{
    left[i] = left[i-1]*nums[i-1]; //从左往右乘到nums[i]之前停下
}
right[numsSize-1] = 1;
for(i=numsSize-2;i>=0;i--)
{
    right[i] = right[i+1]*nums[i+1];//从右往左乘到nums[i]之前停下
}
for(i=0;i<numsSize;i++)
{
    answer[i]=left[i]*right[i];
}
return answer;
}

三、

int* masterMind(char* solution, char* guess, int* returnSize){
*returnSize = 2;
int* answer = (int*)calloc(2,sizeof(int)); 
int hash1[26] = {0};
int hash2[26] = {0};
int i = 0;
for(i=0;i<4;i++)
{
    if(solution[i] == guess[i])
    {
        answer[0]++;
    }
    else
    {
        hash1[solution[i] - 'A']++;
        hash2[guess[i] - 'A']++;
    }
}
for(i=0;i<26;i++)
{
    answer[1] += fmin(hash1[i],hash2[i]);//fmin返回两值最小数
}
return answer;
}

四、

void SWAP(int* start,int* end)
{
    int* left = start;
    int* right = end;
    int mid = 0;
    while(left<right)
    {
        int tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }

}
void rotate(int* nums, int numsSize, int k){
    k %= numsSize; //重点在这,模一下
    //轮转次数等于数组个数时,相当于没轮转,取模消掉多余轮转
    SWAP(nums,nums+numsSize-1-k);
    SWAP(nums+numsSize-k,nums+numsSize-1);
    SWAP(nums,nums+numsSize-1);
}

五、

int removeElement(int* nums, int numsSize, int val)
{
    int length = 0;
    for(int i = 0;i<numsSize-length;)
    {
        if(nums[i] == val)//下标要控制好,当数据往前移动时,i还不能++
        {
            for(int j=i;j<numsSize-1-length;j++)
            {
                nums[j] = nums[j+1];
            }
            length++;
        }
        else
            i++;
    }
    return numsSize - length;
}

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cristiano777.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值