前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。 你可以执行以下操作: 如果两个相邻元素的二

2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。 你可以执行以下操作: 如果两个相邻元素的二

作者头像
福大大架构师每日一题
发布2024-05-27 17:26:14
700
发布2024-05-27 17:26:14
举报
文章被收录于专栏:福大大架构师每日一题

2024-05-25:用go语言,给定一个只包含正整数且下标从0开始的数组nums。

你可以执行以下操作:

如果两个相邻元素的二进制表示中包含相同数量的1,

那么可以交换这两个元素。

你可以重复进行这个操作任意次数(包括0次)。

你的任务是判断能否通过这些操作使得数组变得有序。

如果可以,返回true;否则返回false。

输入:nums = [8,4,2,30,15]。

输出:true。

答案2024-05-25:

chatgpt

题目来自leetcode3011。

大体步骤如下:

1.定义了一个countOnes函数,用来计算一个整数的二进制表示中1的数量。

2.定义了canSortArray函数,用于判断能否通过题目描述的操作使得数组有序。

3.初始化preMax为0,用于记录前一个处理过的最大值。

4.开始遍历数组nums,用i来记录当前位置,n表示nums的长度。

5.对于每个位置i,将当前元素nums[i]视为mx(当前最大值)。

6.统计mx中1的数量,存储在变量ones中。

7.循环遍历直到相邻元素的二进制表示中包含相同数量的1为止,i会逐渐增加。

8.在循环中检查是否当前元素nums[i]小于preMax,若是,返回false。

9.否则,更新mx为较大的值。

10.更新preMax为mx。

11.返回true,表示可以通过操作使数组变得有序。

总的时间复杂度:

  • • countOnes函数的时间复杂度为O(log(maxNum)),其中maxNum表示数组中的最大值。
  • • 在canSortArray函数中,遍历数组一次,不超过n次。
  • • 因此,总的时间复杂度为O(nlog(maxNum))。

总的额外空间复杂度:

  • • 除了函数调用所需的栈空间外,没有使用额外的空间进行存储。
  • • 所以,总的额外空间复杂度为O(1)。 Go完整代码如下:
代码语言:javascript
复制
package main

import (
    "fmt"
)

func countOnes(num int) int {
    count := 0
    for num > 0 {
        count += num & 1
        num >>= 1
    }
    return count
}

func canSortArray(nums []int) bool {
    preMax := 0
    for i, n := 0, len(nums); i < n; {
        mx := nums[i]
        ones := countOnes(mx)
        for ; i < n && countOnes(nums[i]) == ones; i++ {
            if nums[i] < preMax {
                return false
            }
            if nums[i] > mx {
                mx = nums[i]
            }
        }
        preMax = mx
    }
    return true
}

func main() {
    nums := []int{8, 4, 2, 30, 15}
    fmt.Println(canSortArray(nums))
}

Python完整代码如下:

代码语言:javascript
复制
# -*-coding:utf-8-*-

def count_ones(num):
    count = 0
    while num > 0:
        count += num & 1
        num >>= 1
    return count

def can_sort_array(nums):
    pre_max = 0
    i = 0
    n = len(nums)
    while i < n:
        mx = nums[i]
        ones = count_ones(mx)
        while i < n and count_ones(nums[i]) == ones:
            if nums[i] < pre_max:
                return False
            if nums[i] > mx:
                mx = nums[i]
            i += 1
        pre_max = mx
    return True

nums = [8, 4, 2, 30, 15]
print(can_sort_array(nums))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体步骤如下:
  • Python完整代码如下:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档