数据结构刷题-数组

485

 自解:

         给定一个二进制数组, 计算其中最大连续 1 的个数。

int findMaxConsecutiveOnes(int* nums, int numsSize)
{
    int count = 0;
    int Max = 0;
    for(int i = 0; i < numsSize; i++)
    {
        if(1 == nums[i])
        {
            count++;
        }
        else
        {
            Max = count > Max? count : Max;
            count = 0;
        }
    }
    return  count > Max? count : Max;
}

 思路:

         遍历数组,用count来记录为1的元素,当遇到不是为1的元素时,需要将此时的count值与之前的记录的最大连续数Max进行比较,如果更大,就进行记录,然后清零。值得注意的是,由于最后一个元素可能为1,此时应单独对最后一个元素的count和Max进行比较,输出最大值。

官方解:

int findMaxConsecutiveOnes(int* nums, int numsSize) {
    int maxCount = 0, count = 0;
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] == 1) {
            count++;
        } else {
            maxCount = fmax(maxCount, count);
            count = 0;
        }
    }
    maxCount = fmax(maxCount, count);
    return maxCount;
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/max-consecutive-ones/solution/zui-da-lian-xu-1de-ge-shu-by-leetcode-so-252a/
来源:力扣(LeetCode)

知识点:

         官方解与自解思路一致,但是使用到了库函数fmax(),是cmath标头的库函数,用于查找给定数字的最大值,它接受两个数字并返回较大的一个。

682

自解(官方解)

        

        你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。

        比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:

整数 x - 表示本回合新获得分数 x
"+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
"D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
"C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。
请你返回记录中所有得分的总和。

int calPoints(char ** ops, int opsSize){
    int *record = malloc(opsSize*4);
    int top = -1;
    int sum = 0;
    for(int i = 0; i < opsSize ; i++)
    {
        if(ops[i][0] == 'C')
        {
             record[top] = 0;
             top--; 
        }
        else if(ops[i][0] == 'D')
        {
            top++;
            record[top] = record[top-1] *2;
            
        }
        else if(ops[i][0] == '+')
        {
            top++;
            record[top] = record[top -1] +record[top -2];
            
        }
        else
        {
            top++;
            record[top] = atoi(ops[i]); 
            
        }
    }
    for(int j = 0; j <= top;j++)
    {
        sum += record[j];
    }
    free(record);
    record = NULL;
    return sum;
}

知识点      

        解决本题,使用到了数组栈的知识。

        值得注意的是,ops = ["5", "2", "c", "d", "+"]中的ops为二级指针,函数形参实际上为数组指针。

        使用malloc函数后要记得free,谁申请谁还,最后将指针置NULL,野指针啊!!!

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

        将字符串转换成对应的数字,使用atoi函数。

猜你喜欢

转载自blog.csdn.net/MLuhuihui/article/details/121033111