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,野指针啊!!!
将字符串转换成对应的数字,使用atoi函数。