這是悅樂書的第319次更新挟炬,第340篇原創(chuàng)
01 看題和準(zhǔn)備
今天介紹的是LeetCode算法題中Easy級(jí)別的第188題(順位題號(hào)是806)碑宴。我們要將給定字符串S的字母從左到右寫成行奕污。每行最大寬度為100個(gè)單位密任,如果寫一個(gè)字母會(huì)導(dǎo)致該行的寬度超過100個(gè)單位旱捧,則會(huì)寫入下一行脏里。給出一個(gè)數(shù)組寬度,一個(gè)數(shù)組球切,其中widths[0]是'a'的寬度谷誓,widths[1]是'b'的寬度,widths[25]是'z'的寬度吨凑。
現(xiàn)在回答兩個(gè)問題:S中至少有一個(gè)字符有多少行捍歪,最后一行使用的寬度是多少户辱?將答案作為長度為2的整數(shù)數(shù)組返回。例如:
輸入:widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 糙臼,10,10]
S =“abcdefghijklmnopqrstuvwxyz”
輸出:[3,60]
說明:所有字母都有相同的長度10.要寫出所有26個(gè)字母庐镐,我們需要兩條完整的線和一條60個(gè)寬度的線。
輸入:widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 变逃,10,10]
S =“bbbcccdddaaa”
輸出:[2,4]
說明:除“a”之外的所有字母都具有10的相同長度焚鹊,并且“bbbcccdddaa”將涵蓋9 x 10 + 2 x 4 = 98個(gè)單位。對(duì)于最后一個(gè)'a'韧献,它寫在第二行末患,因?yàn)榈谝恍兄皇O?個(gè)單位。所以答案是2行锤窑,第二行加4個(gè)單位璧针。
注意:
S的長度將在[1,1000]的范圍內(nèi)。
S只包含小寫字母渊啰。
widths是一個(gè)長度為26的數(shù)組探橱。
widths[i]將在[2,10]的范圍內(nèi)。
本次解題使用的開發(fā)工具是eclipse绘证,jdk使用的版本是1.8隧膏,環(huán)境是win7 64位系統(tǒng),使用Java語言編寫和測試嚷那。
02 解題
根據(jù)題目的說明和給出的示例胞枕,如果一行上字符長度超過100,就需要換行魏宽,并且需要去判斷最后一次加的那個(gè)字符腐泻,是否正好讓長度變成100換行,還是超過了100队询,需要去判斷一次派桩。
第一步,初始化蚌斩。聲明兩個(gè)局部變量铆惑,count為行數(shù),初始值為1送膳,sum為最后一行使用的寬度员魏。
第二步,循環(huán)肠缨。將S變?yōu)樽址麛?shù)組逆趋,遍歷字符盏阶,對(duì)每個(gè)字符在widths中的寬度進(jìn)行累加晒奕,賦值給sum。如果sum大于100,說明最后加的字符使整體寬度超過了100脑慧,此時(shí)需要換行了魄眉,count加1,sum重新賦值為當(dāng)前字符的寬度闷袒。
第三步坑律,返回結(jié)果。以count囊骤、sum作為數(shù)組(長度為2)元素返回晃择。
public int[] numberOfLines(int[] widths, String S) {
int sum = 0, count = 1;
for (char ch : S.toCharArray()) {
sum += widths[ch-'a'];
if (sum > 100) {
sum = widths[ch-'a'];
count++;
}
}
return new int[]{count, sum};
}
03 小結(jié)
算法專題目前已日更超過五個(gè)月,算法題文章188+篇也物,公眾號(hào)對(duì)話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】宫屠、【算法】、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞滑蚯,獲取系列文章合集浪蹂。
以上就是全部內(nèi)容,如果大家有什么好的解法思路告材、建議或者其他問題坤次,可以下方留言交流,點(diǎn)贊斥赋、留言缰猴、轉(zhuǎn)發(fā)就是對(duì)我最大的回報(bào)和支持!