力扣(LeetCode)刷题,简单题(第6期)

目录

第1题:在排序数组中查找数字

第2题:0~n-1中缺失的数

第3题:反转单次顺序

第4题:和为S的两个数

第5题:和为S的连续正数序列

第6题:左旋转字符串

第7题:滑动窗口的最大值

第8题:扑克牌中的顺子

第9题:圆圈中最后剩下的数字

第10题:不用加、减、乘、除做加法运算


力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

扫描二维码关注公众号,回复: 9799473 查看本文章

第1题:在排序数组中查找数字

试题要求如下:

回答(C语言):

int search(int* nums, int numsSize, int target){
    int cou=0;

    for(int i=0;i<numsSize;i++)
    {
        if(nums[i]==target)
        {
            cou++;
        }
    }
    
    return cou;
}

运行效率如下所示:


第2题:0~n-1中缺失的数

试题要求如下:

回答(C语言):

int missingNumber(int* nums, int numsSize){
    for(int i=0;i<numsSize;i++){
        if(nums[i]!=i){
            return i;
        }     
    }
    return nums[numsSize-1]+1;
}

运行效率如下所示:


第3题:反转单次顺序

试题要求如下:

回答(C语言):

/**
 * 去除重复空格,反转整个字符串,再逐个反转单个单词
 *
 */

void reverse(char* s, int i, int j){
    while(i < j){
        char c = s[i];
        s[i] = s[j];
        s[j] = c;
        i++; j--;
    }
}

char * reverseWords(char * s){
    int i, j, len, flag = 0;
    i = j = 0;
    
    while(s[j]){
        if(s[j] != ' '){
            if(flag == -1 && i > 0){
                s[i++] = ' ';
            }
            s[i++] = s[j++];
            flag = 1;
        }else{
            j++;
            flag = -1;
        }
    }
    s[i] = '\0';
    
    reverse(s, 0, i-1);
    
    len = i;
    i = 0;
    for(j = 0; j <= len; j++){
        if(s[j] == ' ' || s[j] == '\0'){
            reverse(s, i, j-1);
            i = j+1;
        }
    }
    
    return s;
}

运行效率如下所示:


第4题:和为S的两个数

试题要求如下:

回答(C语言):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i=0,j=numsSize-1;
    int* data_buf=(int*)malloc(sizeof(int)*2);
    memset(data_buf,0,sizeof(data_buf));

    *returnSize=2;

    while(i<j){
        if(nums[i]+nums[j]==target){
            data_buf[0]=nums[i];
            data_buf[1]=nums[j];
            break;
        }
        if(nums[i]+nums[j]>target)
            j--;
        else
            i++; 
    }
    return data_buf;
}

运行效率如下所示:


第5题:和为S的连续正数序列

试题要求如下:

回答(C语言):

int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
    int count = 0;
    int MAXN = (int)sqrt(2.0 * target - 0.25); // 确定最大可能的连续值
    int SQUARE = MAXN * (MAXN + 1) / 2;
    int **res = (int**)malloc(MAXN * sizeof(int*));
    int *col = (int*)malloc(MAXN * sizeof(int));
    if (target <= SQUARE) SQUARE -= MAXN--; // 连续和大于目标值时减一
    while(MAXN > 0) {
        if ((target - SQUARE) % (MAXN + 1) == 0) {   
            int *tmp = (int *)malloc((MAXN + 1) * sizeof(int));        
            for (int j = 0; j < MAXN + 1; j++) {
                *(tmp + j) = (target - SQUARE) / (MAXN + 1) + j;
            }
            *(res + count) = tmp;
            *(col + count) = MAXN + 1;
            count++;
        }
        SQUARE -= MAXN--;
    }
    *returnSize = count;
    *returnColumnSizes = col;
    return res;
}

运行效率如下所示:


第6题:左旋转字符串

试题要求如下:

回答(C语言):

char* reverseLeftWords(char* s, int n){
    int j=0;
    int len=strlen(s);
    char *data_buf=(char *)malloc(sizeof(char)*(len+1));

    for(int i=n;i<len;i++){
        data_buf[j++]=s[i];
    }

    for(int i=0;i<n;i++){
        data_buf[j++]=s[i];
    }

    data_buf[len]='\0';

    return data_buf;
}

运行效率如下所示:


第7题:滑动窗口的最大值

试题要求如下:

回答(C语言):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize){
    if(nums==NULL || numsSize<=0){
        *returnSize=0;
        return nums;
    }

    int* data_buf=(int *)malloc(sizeof(int)*(numsSize+1-k));
    int num=0;

    for(int i=0;i<numsSize+1-k;i++){
        num=nums[i];
        for(int j=i+1;j<=i+k-1;j++){
            if(num<nums[j])
                num=nums[j];
        }
        data_buf[i]=num;
    }

    *returnSize=numsSize+1-k;

    return data_buf;
}

运行效率如下所示:


第8题:扑克牌中的顺子

试题要求如下:

回答(C语言):

int cmp ( const void *a , const void *b ) 
{ 
  return *(int *)a > *(int *)b; 
} 

bool isStraight(int* nums, int numsSize){
    int zero=0;
    qsort(nums,5,sizeof(int),cmp); 

    for(int i=0;i<numsSize-1;i++)
    {
        if(nums[i]==0){
            zero++;
            continue;
            }

        if(nums[i]==nums[i+1]) 
            return false;

        if(nums[i]!=nums[i+1]+1)
            zero-=nums[i+1]-nums[i]-1;
    }        
    return zero>=0;
}

运行效率如下所示:


第9题:圆圈中最后剩下的数字

试题要求如下:

回答(C语言):

//约瑟夫环

int lastRemaining(int n, int m){
    int res=0;
    for(int i=2;i<=n;i++)
        res=(res+m)%i;
    return res;
}

运行效率如下所示:


第10题:不用加、减、乘、除做加法运算

试题要求如下:

回答(C语言):

int add(int a, int b){
    int temp=0;

    while(a!=0){
        temp=a^b;
        a=((unsigned int)(a&b)<<1);
        b=temp;
    }
    return b;
}

运行效率如下所示:

发布了162 篇原创文章 · 获赞 8338 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/m0_38106923/article/details/104641452