作者argorok (死肥肥社管)
看板Marginalman
標題Re: [閒聊] 每日leetcode
時間Fri Aug 23 12:56:06 2024
※ 引述《oin1104 (是oin的說)》之銘言:
: 題目:
: 給你字串
: -1/2+1/2
: 3/6-1/3+2/5-10/2
: 要你算出結果
: 思路:
: 機掰
: 超麻煩
: 直接做一個class num
: 然後用operator處理加減
: 生成num就暴力的一個一個字放進去
: 姆咪
我先parse 每個分數字串 跟 +-
再把分數轉成一個struct做+-
做+-就是先通分加減完再約分
最後再轉回字串
class Solution {
struct frac {
int numerator;
int denominator;
frac(string s){
auto pos = s.find('/');
numerator = stoi(s.substr(0, pos));
denominator = stoi(s.substr(pos+1, string::npos));
};
void exec(const frac&& d, char op){
int _lcm = lcm(denominator, d.denominator);
int num_d = d.numerator * (_lcm/d.denominator);
if(op == '+') numerator = (numerator * (_lcm/denominator)) + num_d
;
else numerator = (numerator * (_lcm/denominator)) - num_d;
denominator = _lcm;
if(numerator % denominator == 0){
numerator = numerator / denominator;
denominator = 1;
}
int _gcd = gcd(numerator, denominator);
if(_gcd != 1){
numerator /= _gcd;
denominator /= _gcd;
}
}
inline string to_str() { return to_string(numerator) + string(1, '/')
+ to_string(denominator); }
};
public:
string fractionAddition(string expression) {
vector<string> nums(1000, ""), ops;
int i = 0;
bool isnumerator=true, isdenominator=false;
for(auto c: expression){
if(isdenominator && (c == '+' || c == '-') ) {
ops.push_back(string(1,c));
isnumerator = true;
isdenominator = false;
i++;
} else if(isnumerator || isdenominator){
if(c == '/') {
isnumerator = false;
isdenominator = true;
}
nums[i] += c;
}
}
frac ans(nums[0]);
for(int i = 0; i < ops.size(); ++i){
ans.exec(frac(nums[i+1]), ops[i][0]);
}
return ans.to_str();
}
};
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.228.98.33 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1724388968.A.353.html
推 sustainer123: 我差不多想法 但還沒解完 08/23 12:57
推 oin1104: 我約分那邊是用2~100直接約 因為他有限制大小 08/23 13:00