Golang 字符串中二進制的加法 + 最接近三數之和

//求字符串中的二進制和
//比如 a="11"
	//b= "1"
	//sum= 100
// 目前有兩種方式來做,第一種就是用模擬二進制加法的方式,第二種就是將二進制轉換成十進制
// 然後相加之後,轉回二進制的方法
第一種: 二進制加法
func binarySum(a,b string) string {
	index_a := len(a) - 1
	index_b := len(b) - 1
	jinwei := 0
	result := ""
	for index_a >=0 && index_b >= 0 {
		ia := a[index_a] - '0' // -'0' 可以得到對應數字
		ib := b[index_b] - '0'
		sum := int(ia) + int(ib) + jinwei

		if sum >= 2 {
			jinwei = 1
		} else {
			jinwei = 0
		}
		res := sum % 2 + '0'
		result = fmt.Sprintf("%c%s",res,result)
		index_a--
		index_b--
	}

	for index_a >= 0 {
		ia := a[index_a] - '0'
		sum = int(ia) + jinwei
		if sum >= 2 {
			jinwei = 1
		} else {
			jinwei = 0
		}
		res := sum % 2 + '0'
		result = fmt.Sprintf("%c%s",res,result)
		index_a--
	}
	for index_b >= 0 {
		ib := b[index_b] - '0'
		sum = int(ib) + jinwei
		if sum >= 2 {
			jinwei = 1
		} else {
			jinwei = 0
		}
		res := sum % 2 + '0'
		result = fmt.Sprintf("%c%s",res,result)
		index_b--
	}
	if jinwei == 1 {
		result = fmt.Sprintf("1%s",result)
	}
	return result
}
第二種: math/big 求解
func binaryadd(a,b string ) string {
	ai, _ := new(big.Int).SetString(a,2)
	bo, _ := new(big.Int).SetString(b,2)
	res := ai.Add(ai,bo)
	return res.Text(2)
}
最接近三數之和

func threeSum(nums []int, target int) int {

	// 我們先對切片進行排序,升序排序
	sort.Ints(nums)
	//我們第一次會和一個特別大的差值進行比較,這樣第一個被認爲最接近值會被成功賦值
	best := math.MaxInt32

	// 求絕對值的函數
	abs := func(num int) int {
		if num < 0 {
			return -1 * num
		}
		return num
	}

	update := func(current int) {
		if abs(current-target) < abs(best-target) {
			best = current
		}
	}
	//  []int{1,2,3,4,5,6,7,8,9}
	//		  i
	//          k(i+1) --> 向左移動
	//          向右移動 <---  v
	// 當我們算出來的sum 大於target時,說明nums[v]值可能大了,所以我們得縮小 v 的索引號
	// 當我們算出來的sum 小於target時,說明nums[k]值可能小了,所以我們得增大 v 的索引號
	for i := 0; i < len(nums); i++ {
		if i > 0 && nums[i] == nums[i-1] {
			// 通過比較前後兩個數的大小,可以排除相同元素,加速枚舉過程
			continue
		}
		k, v := i+1, len(nums)-1
		for k < v {
			sum := nums[i] + nums[k] + nums[v]
			update(sum)

			if sum < target {
				k++
			} else if sum > target {
				v--
			} else {
				return target
			}

		}
	}

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