[Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change it to the format of fraction that has denominator 1. So in this case, 2 should be converted to 2/1.

Example 1:

Input:"-1/2+1/2"
Output: "0/1" 

Example 2:

Input:"-1/2+1/2+1/3"
Output: "1/3" 

Example 3:

Input:"1/3-1/2"
Output: "-1/6" 

Example 4:

Input:"5/3+1/3"
Output: "2/1" 

Note:

  1. The input string only contains ‘0‘ to ‘9‘‘/‘‘+‘ and ‘-‘. So does the output.
  2. Each fraction (input and output) has format ±numerator/denominator. If the first input fraction or the output is positive, then ‘+‘ will be omitted.
  3. The input only contains valid irreducible fractions, where the numerator and denominator of each fraction will always be in the range [1,10]. If the denominator is 1, it means this fraction is actually an integer in a fraction format defined above.
  4. The number of given fractions will be in the range [1,10].
  5. The numerator and denominator of the final result are guaranteed to be valid and in the range of 32-bit int.


给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1

示例 1:

输入:"-1/2+1/2"
输出: "0/1"

示例 2:

输入:"-1/2+1/2+1/3"
输出: "1/3"

示例 3:

输入:"1/3-1/2"
输出: "-1/6"

示例 4:

输入:"5/3+1/3"
输出: "2/1"

说明:

  1. 输入和输出字符串只包含 ‘0‘ 到 ‘9‘ 的数字,以及 ‘/‘‘+‘ 和 ‘-‘
  2. 输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 ‘+‘ 会被省略掉。
  3. 输入只包含合法的最简分数,每个分数的分子与分母的范围是  [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
  4. 输入的分数个数范围是 [1,10]。
  5. 最终结果的分子与分母保证是 32 位整数范围内的有效整数。


Runtime: 8 ms

Memory Usage: 19.4 MB

 1 class Solution {
 2     func fractionAddition(_ expression: String) -> String {
 3         var n = 0
 4         var d = 1
 5         var s = Array(expression)
 6         if s[0] != "-" {
 7             s.insert("+", at: 0)
 8         }
 9         var p = 0
10         while p < s.count {
11             var p1 = p + 1
12             while s[p1] != "/" {
13                 p1 += 1
14             }
15             var p2 = p1 + 1
16             while p2 < s.count && s[p2] != "+" && s[p2] != "-" {
17                 p2 += 1
18             }
19
20             let nn = Int(String(s[p+1..<p1]))!
21             let dd = Int(String(s[p1+1..<p2]))!
22             let g = gcd(d, dd)
23
24             n = n * dd / g + (s[p] == "-" ? -1 : 1) * nn * d / g
25             d *= dd / g
26             p = p2
27         }
28
29         let g = gcd(abs(n), d)
30         return String(n / g) + "/" + String(d / g)
31     }
32
33     func gcd(_ a: Int, _ b: Int) -> Int {
34         return (b == 0) ? a: gcd(b, a % b)
35     }
36 }

原文地址:https://www.cnblogs.com/strengthen/p/10450070.html

时间: 2024-11-10 08:01:08

[Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction的相关文章

Leetcode 592.分数加减运算

分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1.所以在上述例子中, 2 应该被转换为 2/1. 示例 1: 输入:"-1/2+1/2" 输出: "0/1"  示例 2: 输入:"-1/2+1/2+1/3" 输出: "1/3" 示例 3: 输入:"1/3-1/

字符串大数加减运算问题

这里自己利用STL模板中的容器和链表实现字符串大数加减运算. 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符 7 { 8 cout<<"please Input string ,end

C_BigDecimal_加减运算

首先举个例子说说思路: 输入str1:1.341   str2:11.2  在C语言中存储字符串的直接是字符型数组,strlen(str)代表字符串的长度(那个小数点也要算的),则str1,str2的长度为5和4.而浮点数加减运算时遵循从右往左计算,所以首先要使得字符串格式化.找到并返回存储字符串中小数点的下标,str1,str2小数点位置下标为1和2,然后用字符串长度减去即可求出小数点后的位数差,通过循环将短的加0补齐,为1.341,11.200,最后按最长长度循环将字符从右依次赋值给自定的c

linux date 加减运算

在linux shell编程中,经常用到日期的加减运算 查看时间: [[email protected] ~]# date Fri Sep  2 13:12:56 CST 2016 修改时间: [[email protected] ~]# date -s "1980-01-01 00:00:00" Tue Jan  1 00:00:00 CST 1980 其实date命令本身提供了日期的加减运算 非常方便.例如:得到昨天的时间date +%Y%m%d --date="-1 d

让文本框支持加减运算的实现方法

一个网页表单效果,让表单内的文本框支持加减运算,不过你要按正确的运算式输入,要不然它没有那么智能哦,比如输入1+5,文本框旁边会显示计算结果,这要归功于JavaScript的功能. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&

Oracle 如何对时间进行简单加减运算

在我们用dbms_job包进行定时Job的时候,需要设置时间间隔,所以需要知道时间的基本加减方法. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 会话已更改. SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual; --分别是加一小时,一分钟,一秒钟 SYSDATE SYSDATE+1/24 SYSDATE+

浮点加减运算中左规右规问题

当尾数用二进制表示时,浮点规格化的定义是尾数M应满足:  1/2   ≤  |M|<1 显然对于正数而言,有M = 00.1φφ-φ:对于负数,其补码形式为11.0φφ-φ(即-0.0*******,左归).这样,当进行补码浮点加减运算时,只要对运算结果的符号位和小数点后的第一位进行比较:如果它们不等,即为00.1φφ-φ或11.1φφ-φ,就是规格化的数:如果它们相等,即为00.0φφ-φ或11.0φφ-φ,就不是规格化的数,在这种情况下需要尾数左移以实现规格化的过程,叫做向左规格化.规则是:

[Math_Medium] 592. Fraction Addition and Subtraction

原题:592. Fraction Addition and Subtraction 题目大意: 给出一个分数字符串式子(分子分母都是1~10),求其和 解题思路: 利用stringstream,它可以自动地实现字符串和数字之间的转换,比如 -1/2,可以输出为-1,/,2,把每个数取出来后就通分进行计算 代码: class Solution{ public: int gcd(int a,int b) { int c=0; while(b) { c=a%b; a=b; b=c; } return

LC 592. Fraction Addition and Subtraction

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change