char * intToRoman(int num){char symbol[7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
int values[7] = {1, 5, 10, 50, 100, 500, 1000};
int counts[7] = {0};
int sum = 0, index = 0;
if(num< 1 || num >3999) return '\0';
for(int i = 6; i >= 0; i --){if(num / values[i] == 0) continue;
else{counts[i] = num / values[i];
num = num % values[i];
}
}
for(int j = 6; j >= 0; j --){if(counts[j] == 4){if(counts[j + 1] == 1) sum = sum + 1;
else if(counts[j + 1] == 0) sum = sum + 2;
}
else{sum = sum + counts[j];
}
}
char* str = (char*)malloc(sizeof(char) * (sum + 1));
for(int k = 6; k >= 0; k --){while(counts[k] != 0){if(k >= 1 && counts[k] == 1 && counts[k - 1] == 4){str[index] = symbol[k - 1];
str[index + 1] = symbol[k + 1];
index += 2;
counts[k]--;
counts[k - 1] = 0;
}else if(counts[k] == 4 && counts[k + 1] == 0){str[index] = symbol[k];
str[index + 1] = symbol [k + 1];
counts[k] = 0;
index += 2;
}
else{str[index] = symbol[k];
counts[k]--;
index++;
}
}
}
str[sum] = '\0';
return str;
}
代碼量很大,也不太知道該怎么優(yōu)化,希望各位大佬能指點指點。
具體思路:這道題看過之后,我的想法是先用每個符號對應的值,和原來的整數(shù)做除法,取整數(shù)部分,然后留余數(shù)繼續(xù)進行迭代,直到所有的對應的值都計算完,這時候有就能保存每個符號對應要出現(xiàn)幾次。但是由于帶有4和9的值都需要特殊處理:
由于之前已經計算出每個符號對應的數(shù)量,根據(jù)上面兩種特殊情況,再次處理一下所有符號的個數(shù),對于9之類的數(shù)值原來需要5個符號來表示,根據(jù)要求則需要2個符號表示,對于4之類的數(shù)值需要4個符號來表示,根據(jù)要求則需要2個符號表示。上述代碼的第二個for循環(huán)即處理這個問題,也就是要準確的分配空間。
最后在寫入符號的過程中,也需要處理這兩種問題,遇到9和4之類的數(shù)值,要直接按規(guī)則寫入對應的兩個字符,然后存儲字符的數(shù)組索引值加兩個,同時要直接清空對應的counts數(shù)組,避免繼續(xù)進行while循環(huán)。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁題目:Leetcode:IntegerToRoman(C語言版)-創(chuàng)新互聯(lián)
文章URL:http://muchs.cn/article42/dddoec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站改版、建站公司、App開發(fā)、網(wǎng)站設計公司、用戶體驗
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)