Re: [閒聊] 每日leetcode

作者: argorok (s.green)   2024-08-23 12:56:06
※ 引述《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();
}
};
作者: sustainer123 (caster)   2024-08-23 12:57:00
我差不多想法 但還沒解完
作者: oin1104 (是oin的說)   2024-08-23 13:00:00
我約分那邊是用2~100直接約 因為他有限制大小

Links booklink

Contact Us: admin [ a t ] ucptt.com