小米OJ-19題-Go

小米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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章