Golang面试考题记录 ━━ 加一,暂无执行排名

===问:

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

===答:

方法一:执行(暂无结果),内存97.32%

func plusOne1(digits []int) []int {
	l := len(digits)
	// 是否需要增加一位
	k := 1
	for i := l - 1; i >= 0; i-- {
		v := digits[i] + 1
		if v >= 10 {
			// 如果已经循环完毕,则还多出一个1,在后面补齐
			digits[i] = v - 10
		} else {
			digits[i] = v
			k = 0
			break
		}
	}

	// 如果需要增加一位则重组切片
	if k == 1 {
		digits = append([]int{1}, digits...)
	}
	return digits
}

方法二:执行(暂无结果),内存97.32%
和方法一比没什么不同,就是减少几个变量

func plusOne2(digits []int) []int {
	// 是否需要增加一位
	k := 1
	for i := len(digits) - 1; i >= 0; i-- {
		digits[i]++
		if digits[i] >= 10 {
			// 如果已经循环完毕,则还多出一个1,在后面补齐
			digits[i] -= 10
		} else {
			k = 0
			break
		}
	}

	// 如果需要增加一位则重组切片
	if k == 1 {
		digits = append([]int{1}, digits...)
	}
	return digits
}

===注:

两种方法里,其中一个用了变量v来存储digital[i]的值进行操作,而另一个是直接用digital[i]进行操作,各有优劣,但是依照前几题的经验,如果在较长的切片中用digital[i]直接进行操作会影响执行效率。但本次测试并未能得到执行效率的排行,所以暂时未知哪种方法更好。

笑:
刚拿到手的时候第一反应是把切片整合成整数,再+1,得到的数切割一下不就行了?
于是~~

func plusOne3(digits []int) []int {
    var r []int
	var s string
	// 将切片内数字整合为字符串
	for _, v := range digits {
		s += strconv.Itoa(v)
	}
	// 将字符串变为整数
	d, err := strconv.Atoi(s)
	if err != nil {
		return r
	}
	// 整数+1
	d++
	// 整数变字符串
	s = strconv.Itoa(d)
	// 字符串变切片
	for _, v := range s {
		if y, err := strconv.Atoi(string(v)); err == nil {
			r = append(r, y)
		}
	}
	// 返回
	return r
}

展示这种方法只是提供一种思路,其结果是错的,其只能用于整数范围计算,如果给的切片是:
[]int{1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9}
很显然超出整数位数了,无法进行计算,结果也必然是[]int{}

发布了44 篇原创文章 · 获赞 1 · 访问量 3595

猜你喜欢

转载自blog.csdn.net/snans/article/details/105182524