小米OJ第19題Go語言實現:
問題鏈接:https://code.mi.com/problem/list/view?id=19
描述
對於給定的算術表達式,按規則輸出計算結果,僅包含加法和大小判斷。
輸入
一行字符串,爲加號、大於、小於( + < > ) 連接的兩個不限大小的非負整數。
輸出
當符號爲 + 時, 計算兩個數相加的和, 並以字符串格式返回; 當符號爲 < 時, 如果左數小於右數, 返回大寫字母字符 Y, 否則返回大寫字母字符 N; 當符號爲 > 時, 如果左數大於右數, 返回大寫字母字符 Y, 否則返回大寫字母字符 N。
!!!請同學們儘量使用算法來解決這個問題
輸入樣例
972919822976663297>74058
875098336507333719633571722631534917759993913379786689>53558270653237768027942884431075534537929401567824882097903948774409200
7625022925148127196027859399571498914361+790786706794530
輸出樣例
Y
N
7625022925148127196027860190358205708891
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func solution19(line string) string {
if strings.Contains(line, "+") {
return getAddResult(line)
}
return judgeBiggerResult(line)
}
func getAddResult(str string) string {
strArray := strings.Split(str, "+")
first := []byte(strArray[0])
second := []byte(strArray[1])
minLen := len(first)
if len(first) > len(second) {
minLen = len(second)
first, second = second, first
}
step := 0
addNumber := 0
j := len(second) - 1
for i := minLen - 1; j >= 0; i-- {
if i >= 0 {
addNumber = step + int(first[i]-'0') + int(second[j]-'0')
} else {
addNumber = step + int(second[j]-'0')
}
if addNumber >= 10 {
addNumber = addNumber - 10
step = 1
} else {
step = 0
}
second[j] = byte('0' + addNumber)
j--
}
if step > 0 {
return "1" + string(second)
}
return string(second)
}
func judgeBiggerResult(str string) string {
var first []byte
var second []byte
if strings.Contains(str, ">") {
strArray := strings.Split(str, ">")
first = []byte(strings.TrimLeft(strArray[0], "0"))
second = []byte(strings.TrimLeft(strArray[1], "0"))
} else {
strArray := strings.Split(str, "<")
first = []byte(strings.TrimLeft(strArray[1], "0"))
second = []byte(strings.TrimLeft(strArray[0], "0"))
}
if len(first) > len(second) {
return "Y"
}
if len(first) < len(second) {
return "N"
}
for i := 0; i < len(first); i++ {
if first[i] > second[i] {
return "Y"
}
if first[i] < second[i] {
return "N"
}
}
return "N"
}
func main() {
r := bufio.NewReaderSize(os.Stdin, 20480)
for line, _, err := r.ReadLine(); err == nil; line, _, err = r.ReadLine() {
fmt.Println(solution19(string(line)))
}
}
注:
此題不熟悉的地方在對string根據下標進行加操作,需要轉換成byte數組纔行,因爲string是個常量,不支持變更操作。
大數相加從時間複雜度和空間複雜度兩點考慮,複用了較長的一個輸入參數數組,同時將相加完之後的操作放入到一個循環裏解決,時間複雜度爲O(n)。