Re: [閒聊] 每日leetcode
※ 引述《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
推
08/23 12:57,
1年前
, 1F
08/23 12:57, 1F
推
08/23 13:00,
1年前
, 2F
08/23 13:00, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 757 之 1548 篇):