力扣每日一题806. 写字符串需要的行数
这是一道有关字符串的问题。
观察完题干后我们意识到,widths数组中每个元素都是每个字母所占的宽度,每一行的宽度为100。
处理这道题最核心的地方,在于换行
如图,假如a b c宽度都为40,放了a b之后,第一行还剩余20的空间, 但是放不下c了,所以直接舍弃,把c放入第二行
这一点明白后,这道题就很容解答了
> 我们先定义几个变量 int row=1;//因为起始开始计算的时候,就最起码有一行 int base=0; int temp=0; > row就是行数,base用于累加宽度,temp则是每一次循环求出来的字符宽度 for(int i=0;s[i]!= ;i++) { temp=s[i]-a; > 这里我们可以直接让s[i]与a相减,得到的就是这个字母在widths数组中元素下标。 if(base+widths[temp]>100)//大于100的时候,换行 { base=0; row++; base+=widths[temp]; } else//小于等于100就可以直接累加 { base+=widths[temp]; } }
按照这个逻辑,我们就可以很轻易的求出行数,以及最后一行的字母所占的宽度
完整代码如下👇
int* numberOfLines(int* widths, int widthsSize, char * s, int* returnSize){ int base=0; int count=1; int temp=0; for(int i=0;s[i]!= ;i++) { temp=s[i]-a; if(base+widths[temp]>100) { base=0; count++; base+=widths[temp]; } else { base+=widths[temp]; } } int *nums=(int *)malloc(sizeof(int)*2); nums[0]=count; nums[1]=base; *returnSize=2; return nums; }
最后可以完美通过