头条面试题-统计有序数组里平方和的数目

给你一个有序整数数组,数组中的数可以是正数、负数、零,请实现一个函数,这个函数返回一个整数:返回这个数组所有数的平方值中有多少种不同的取值。举例:

nums = {-1,1,1,1},

那么你应该返回的是:1。因为这个数组所有数的平方取值都是1,只有一种取值

nums = {-1,0,1,2,3}

你应该返回4,因为nums数组所有元素的平方值一共4种取值:1,0,4,9

解题思路
  • 双指针向 0 靠近
func abs(a int) int {
	if a >= 0 {
		return a
	}
	return -a
}

func differentPow(nums []int) int {
	
	if len(nums) == 0 {
		return 0
	}
	
	left := 0
	right := len(nums) - 1
	cnt := 0
	for left <= right {
		if nums[left] == nums[right] {
			cnt++
			break
		}
		if abs(nums[left]) == abs(nums[right]) {
			for left <= right && left+1 < len(nums) && nums[left] == nums[left+1] {
				left++
			}
			left++
			for left <= right && right-1 >= 0 && nums[right] == nums[right-1] {
				right--
			}
			right--
		} else if abs(nums[left]) < abs(nums[right]) {
			for left <= right && right-1 >= 0 && nums[right] == nums[right-1] {
				right--
			}
			right--
		} else {
			for left <= right && left+1 < len(nums) && nums[left] == nums[left+1] {
				left++
			}
			left++
		}
		cnt++
	}
	return cnt
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值