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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值