当前位置:首页 > 技术文章 > 正文内容

2025-08-30:将数组按照奇偶性转化。用go语言,对给定的整数数组

zonemu1个月前 (09-06)技术文章18

2025-08-30:将数组按照奇偶性转化。用go语言,对给定的整数数组 nums 先进行二值化处理(偶数改为 0,奇数改为 1),然后把得到的数组按升序排列,返回排序后的结果。

1 <= nums.length <= 100。

1 <= nums[i] <= 1000。

输入:nums = [4,3,2,1]。

输出:[0,0,1,1]。

解释:

将偶数(4 和 2)替换为 0,将奇数(3 和 1)替换为 1。现在,nums = [0, 1, 0, 1]。

按非递减顺序排序 nums,得到 nums = [0, 0, 1, 1]。

题目来自力扣3467。

根据题目要求和提供的代码,整个过程可以分为以下几个详细步骤:

步骤描述:

1. 统计偶数个数
首先,遍历整个数组
nums,统计其中偶数的个数。初始化计数器 count 为 0。对于数组中的每个元素,检查它是否为偶数(即元素对 2 取模等于 0)。如果是偶数,则将计数器 count 加 1。这一步完成后,count 的值就是数组中偶数的总数。

2. 将前 count 个位置置为 0
由于最终需要将数组按升序排列(即所有的 0 在前,所有的 1 在后),并且已知偶数的个数为
count,那么排序后前 count 个位置应该是 0(因为偶数对应 0)。因此,直接遍历数组的前 count 个位置,将每个位置的值设置为 0。

3. 将剩余位置置为 1
剩下的位置(从索引
count 开始到数组末尾)应该都是奇数对应的 1。因此,从数组的最后一个元素开始向前遍历,直到索引 count(包括),将每个位置的值设置为 1。注意:这里代码是从后往前设置,但实际上也可以从索引 count 开始往后设置为 1(但代码中是从后往前,效果相同)。

4. 返回处理后的数组
经过上述操作后,数组的前
count 个位置都是 0,后面的位置都是 1,整个数组已经按升序排列。直接返回该数组即可。

注意:

o 原始数组中的元素被直接修改,没有使用额外的数组来存储结果(除了几个变量)。

o 整个过程实际上没有进行真正的“排序”,而是利用偶数个数直接构造了排序后的结果(因为只有 0 和 1,且需要升序排列)。

复杂度分析:

o 时间复杂度:O(n),其中 n 是数组的长度。
第一步遍历整个数组统计偶数个数,需要 O(n) 时间。第二步遍历前
count 个位置(最多 n)设置为 0,需要 O(n) 时间。第三步遍历剩余位置(最多 n)设置为 1,也需要 O(n) 时间。因此总时间复杂度是线性的,即 O(n)。

o 额外空间复杂度:O(1)。
整个过程只使用了常数个额外变量(如计数器
count 和循环索引 i),没有使用与输入规模相关的额外空间(如额外数组)。因此额外空间复杂度是常数级别 O(1)。

总结:该方法高效地利用了问题特性(二值化后只有 0 和 1,且需要升序排列),通过统计偶数个数直接构造结果,避免了常规排序(如快速排序、归并排序等)所需的 O(n log n) 时间,实现了线性时间复杂度和常数空间复杂度。

Go完整代码如下:

package main

import (
    "fmt"
)

func transformArray(nums []int) []int {
    count := 0
    for i := range nums {
        if nums[i]%2 == 0 {
            count++
        }
    }
    for i := 0; i < count; i++ {
        nums[i] = 0
    }
    for i := len(nums) - 1; i >= count; i-- {
        nums[i] = 1
    }
    return nums
}

func main() {
    nums := []int{4, 3, 2, 1}
    result := transformArray(nums)
    fmt.Println(result)
}


Python完整代码如下:

# -*-coding:utf-8-*-

from typing import List

def transformArray(nums: List[int]) -> List[int]:
    count = 0
    for num in nums:
        if num % 2 == 0:
            count += 1
    
    for i in range(count):
        nums[i] = 0
    
    for i in range(count, len(nums)):
        nums[i] = 1
    
    return nums

# 测试代码
if __name__ == "__main__":
    nums = [4, 3, 2, 1]
    result = transformArray(nums)
    print(result)



·



我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。


欢迎关注“福大规模架构师每日一题”,让 Go 语言和算法助力您的职业发展

·

相关文章

细数5款国外热门Linux发行版(linux发行版排名网站)

Linux系统已经与我们的生活息息相关,当你用Android手机浏览这篇文章时,你就已经在使用Linux系统。当然作为编程开发最热门的系统,他还有很多专注于开发使用的版本。Fedora热门入门推荐,一...

(在线编辑DWG)网页CAD二开实现焊接符号绘制

前言在工程制图和制造领域,焊接符号(Welding Symbols)是用于表示焊缝类型、尺寸、位置以及工艺要求的标准化图形语言。广泛应用于机械设计、钢结构、船舶制造、压力容器等行业中,帮助技术人员理解...

15款测试html5响应式的在线工具(测试类h5)

手机、平板灯手持设备的增多,网站要顺应变化,就必须要做响应式开发,响应式网站最大的特点在于可以在不同设备下呈现不同的布局,是基于html5+css3技术,目前越来越多的网站开始采用了响应式设计,而下面...

Web前端全套教程+视频包含JavaScript、Vue等

写在前面:web前端从入门到精通经典教程,老师精心讲,想从事编程或者数据分析行业的小伙伴点进来,只需你评论并关注私信留言“前端”。便可免费获取。WEB前端简介:WEB前端工程师,也叫Web前端开发工程...

web前端是什么,在哪些地方有应用,html和html5区别都在这里了

web前端是什么,在哪些地方有应用简介web前端开发技术什么是html、html5什么是css、css3什么是js,javascriptweb前端的应用大家好,我是ots_luo,很多小伙伴不知道we...

一键看懂Html5,就这么简单(查看html的app推荐)

HTML5是WEB开发世界的一次重大的改变,事实上不管你是否喜欢,它都是代表着未来趋势。曾几何时,当HTML5出现在web端开发领域的时候,并没有引起太多人的注意,究其原因,一方面是它还没有被广泛的支...