專(zhuān)業(yè)網(wǎng)站建設(shè)哪家權(quán)威微信指數(shù)怎么看
翻譯:?
主要思路解釋
- 整體思路概述:
- 本題的目標(biāo)是給定整數(shù)(要?jiǎng)h除的數(shù)字個(gè)數(shù))和整數(shù)(以字符串形式表示的數(shù)字),通過(guò)合理刪除個(gè)數(shù)字,使得最終得到的新數(shù)字最小。程序采用了一種貪心算法的思想,從左到右遍歷數(shù)字字符串,每次嘗試刪除能使當(dāng)前數(shù)字變小的高位數(shù)字,經(jīng)過(guò)多次這樣的操作以及一些邊界情況處理后,輸出最終得到的最小數(shù)字字符串表示的結(jié)果。
- 輸入與初始化部分:
- 首先定義了多個(gè)變量,包括用于存儲(chǔ)測(cè)試用例數(shù)量的、每個(gè)測(cè)試用例中要?jiǎng)h除數(shù)字個(gè)數(shù)的、數(shù)字字符串長(zhǎng)度的以及用于循環(huán)計(jì)數(shù)的和等,同時(shí)定義了字符數(shù)組用于存儲(chǔ)輸入的數(shù)字字符串。通過(guò)
scanf
函數(shù)讀取測(cè)試用例的數(shù)量,然后進(jìn)入外層while
循環(huán)處理每個(gè)測(cè)試用例。在每個(gè)測(cè)試用例中,先讀取要?jiǎng)h除的數(shù)字個(gè)數(shù)和數(shù)字字符串,接著使用strlen
函數(shù)獲取字符串 (n的長(zhǎng)度并存儲(chǔ)到
len` 變量中。
- 首先定義了多個(gè)變量,包括用于存儲(chǔ)測(cè)試用例數(shù)量的、每個(gè)測(cè)試用例中要?jiǎng)h除數(shù)字個(gè)數(shù)的、數(shù)字字符串長(zhǎng)度的以及用于循環(huán)計(jì)數(shù)的和等,同時(shí)定義了字符數(shù)組用于存儲(chǔ)輸入的數(shù)字字符串。通過(guò)
- 核心處理邏輯部分(尋找并刪除數(shù)字):
- 外層
for
循環(huán)用于遍歷數(shù)字字符串(除了最后一個(gè)字符,因?yàn)楸容^時(shí)是和下一個(gè)字符對(duì)比),在循環(huán)中,對(duì)于每個(gè)字符位置 (i,判斷如果當(dāng)前字符
n[i]大于下一個(gè)字符
n[i + 1],并且還有可刪除的數(shù)字(
m不等于0),這意味著刪除當(dāng)前字符可以使得到的新數(shù)字更小。此時(shí),通過(guò)內(nèi)層
for循環(huán)將當(dāng)前字符后面的所有字符依次向前移動(dòng)一位(
n[j] = n[j + 1]),實(shí)現(xiàn)刪除當(dāng)前字符的效果,然后將字符串長(zhǎng)度
len減1(因?yàn)閯h除了一個(gè)字符),可刪除數(shù)字個(gè)數(shù)
m也減1。為了確保能重新從字符串開(kāi)頭開(kāi)始檢查是否還有可刪除的能使數(shù)字變小的字符,將
i重置為 -1,并且如果此時(shí)已經(jīng)刪除了足夠數(shù)量的數(shù)字(
m變?yōu)?/span>0),就直接跳出外層
for` 循環(huán),不再繼續(xù)尋找可刪除的數(shù)字了。
- 外層
- 處理前導(dǎo)零及輸出結(jié)果部分:
- 首先通過(guò)一個(gè)
while
循環(huán)找到處理后的字符串中第一個(gè)非零字符的位置,存儲(chǔ)到變量a
中,跳過(guò)前面可能存在的連續(xù)的 0。然后通過(guò)一個(gè)for
循環(huán)從第一個(gè)非零字符位置a
開(kāi)始,到len - m
結(jié)束(因?yàn)橐呀?jīng)刪除了m
個(gè)字符),逐個(gè)輸出剩余字符串的字符,這就是最終得到的刪除m
個(gè)數(shù)字后的數(shù)字字符串表示。最后,再判斷如果第一個(gè)非零字符的位置a
大于等于剩余字符串的長(zhǎng)度(len - m
),說(shuō)明剩下的字符串全是 0 或者為空,此時(shí)輸出 0 作為最終結(jié)果,并且每個(gè)測(cè)試用例輸出完結(jié)果后進(jìn)行換行操作,以便下一個(gè)測(cè)試用例的結(jié)果能正確顯示,持續(xù)處理所有測(cè)試用例,直到全部處理完畢。
- 首先通過(guò)一個(gè)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{int T, m, len, i, j; // T用于存儲(chǔ)測(cè)試用例的數(shù)量,m表示每個(gè)測(cè)試用例中要?jiǎng)h除的數(shù)字個(gè)數(shù),len用于記錄輸入數(shù)字字符串的長(zhǎng)度,i、j主要用于循環(huán)計(jì)數(shù)char n[1002]; // 定義字符數(shù)組n,用于存儲(chǔ)輸入的數(shù)字字符串,大小設(shè)為1002,可根據(jù)題目中數(shù)字字符串長(zhǎng)度的限制進(jìn)行合理設(shè)置// 讀取測(cè)試用例的數(shù)量Tscanf("%d", &T);// 外層while循環(huán),針對(duì)每個(gè)測(cè)試用例進(jìn)行處理,每處理完一個(gè)測(cè)試用例,T減1,直到所有測(cè)試用例都處理完while (T--){// 讀取當(dāng)前測(cè)試用例中要?jiǎng)h除的數(shù)字個(gè)數(shù)m以及數(shù)字字符串nscanf("%d%s", &m, &n);len = strlen(n); // 獲取輸入數(shù)字字符串n的長(zhǎng)度// 如果要?jiǎng)h除的數(shù)字個(gè)數(shù)m大于等于字符串的長(zhǎng)度len,說(shuō)明要?jiǎng)h除的數(shù)字太多,直接輸出0,并通過(guò)continue跳過(guò)當(dāng)前測(cè)試用例后續(xù)的處理步驟,直接進(jìn)入下一個(gè)測(cè)試用例的處理if (m >= len){printf("0\n");continue;}// 外層for循環(huán)用于遍歷數(shù)字字符串(除了最后一個(gè)字符,因?yàn)楸容^時(shí)是和下一個(gè)字符對(duì)比),嘗試找到可以刪除的數(shù)字,以得到最小的新數(shù)字for (i = 0; i < len - 1; i++){// 如果當(dāng)前字符大于下一個(gè)字符,且還有可刪除的數(shù)字(m不等于0),說(shuō)明可以通過(guò)刪除當(dāng)前字符來(lái)使得到的新數(shù)字更小if (n[i] > n[i + 1] && m!= 0){// 內(nèi)層for循環(huán),將當(dāng)前字符后面的所有字符依次向前移動(dòng)一位,實(shí)現(xiàn)刪除當(dāng)前字符的效果for (j = i; j < len - 1; j++){n[j] = n[j + 1];}len--; // 字符串長(zhǎng)度減1,因?yàn)閯h除了一個(gè)字符m--; // 可刪除的數(shù)字個(gè)數(shù)減1i = -1; // 將i重置為 -1,使得下一次循環(huán)時(shí)會(huì)重新從字符串開(kāi)頭開(kāi)始遍歷,因?yàn)榍懊娴淖址恢冒l(fā)生了變化,需要重新檢查if (m == 0) // 如果已經(jīng)刪除了足夠數(shù)量的數(shù)字(m變?yōu)?),就不需要再繼續(xù)遍歷尋找可刪除的數(shù)字了,直接跳出循環(huán)break;}}int a = 0;// 這個(gè)循環(huán)用于找到處理后的字符串中第一個(gè)非零字符的位置,跳過(guò)前面可能存在的連續(xù)的0while (n[a] == '0'){a++;}// 循環(huán)輸出刪除m個(gè)數(shù)字后剩下的字符串內(nèi)容,從第一個(gè)非零字符位置a開(kāi)始,到len - m結(jié)束(因?yàn)橐呀?jīng)刪除了m個(gè)字符)for (i = a; i < len - m; i++){printf("%c", n[i]);}// 如果經(jīng)過(guò)前面的處理后,第一個(gè)非零字符的位置a大于等于剩余字符串的長(zhǎng)度(len - m),說(shuō)明剩下的字符串全是0或者為空,此時(shí)輸出0if (a >= len - m){printf("0");}printf("\n"); // 每個(gè)測(cè)試用例輸出完結(jié)果后進(jìn)行換行,以便下一個(gè)測(cè)試用例的結(jié)果能正確顯示}return 0;
}