网易首页 > 网易号 > 正文 申请入驻

2026-09-01:限制有序数组中的元素出现次数。用go语言,给定一个已经按从小到大排好的整数列表 nums,以及一个整数 k。现在需要生成一个

0
分享至

2026-09-01:限制有序数组中的元素出现次数。用go语言,给定一个已经按从小到大排好的整数列表 nums,以及一个整数 k。现在需要生成一个新列表,这个列表要满足:原列表中的每个数值,在新列表中最多只能重复出现 k 次,并且所有元素的先后顺序必须和原列表中的顺序完全一致。最后返回这个新列表。

1 <= nums.length <= 100。

1 <= nums[i] <= 100。

nums 按非递减顺序排序。

1 <= k <= nums.length。

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

输出: [1,1,2,2,3]。

解释:

每个元素最多可以出现 2 次。

元素 1 出现了 3 次,因此只保留其中 2 次。

元素 2 出现了 2 次,因此全部保留。

元素 3 出现了 1 次,因此保留。

因此,结果数组为 [1, 1, 2, 2, 3]。

题目来自力扣3940。

算法步骤详细描述

  1. 1.输入与初始设定
    给定一个已按非递减顺序排好的整数数组nums,以及一个正整数k(表示每个不同元素最多允许出现的次数)。数组长度记为n

  2. 2.前 k 个元素默认保留
    由于数组已经排序,任何元素在数组中都是连续出现的。前k个元素(索引0k-1)中,同一个值的出现次数不可能超过k(因为总共才k个位置),因此它们一定满足“最多出现k次”的条件,可以直接纳入最终结果。
    为此,定义一个指针writePos(或称为栈大小),初始值为k,表示当前已保留的有效元素个数,也即下一个可写入位置。

  3. 3.从第 k 个元素开始逐个检查
    从索引i = k开始,依次遍历数组的剩余元素(直到末尾)。对于每个元素nums[i],需要判断是否应该保留。

  4. 4.判断是否保留当前元素的依据
    想要保留nums[i],必须确保该元素在已保留的结果中出现的次数还没有达到k次。
    因为数组是有序的,相同的元素必定连续出现。在已经保留的结果中,如果当前元素已经出现了k次,那么这k个相同元素必然位于结果区的末尾(因为有序)。结果区的末尾部分就是索引从writePos - kwritePos - 1的位置,其中倒数第k个就是索引writePos - k
    因此,只需比较当前元素nums[i]与结果区中倒数第k个元素(即nums[writePos - k])是否相等:

  • 若不相等:说明当前元素在结果区中的出现次数尚未达到k次(因为如果已经达到,那么倒数第k个元素必然等于当前元素)。此时该元素可以保留,将其写入nums[writePos](覆盖原值),然后将writePos加 1。

  • 若相等:说明当前元素已经在结果区中出现了k次,再添加就会超过限制,因此跳过该元素,不进行写入,继续处理下一个元素。

5.原地更新与覆盖的安全性
由于writePos总是小于或等于当前遍历的索引i(因为要么写入并增加,要么跳过,所以writePos不会超过i),因此写入操作不会覆盖尚未检查到的未来元素,保证了算法的正确性。

6.遍历结束
当循环结束后,所有原数组元素都被检查完毕。此时,数组的前writePos个元素(即nums[0:writePos])就是满足条件的结果序列,它们保持了原顺序,且每个不同元素最多出现k次。

7.返回结果
返回切片nums[:writePos]作为最终的新列表(此处返回的是原数组的视图,不复制数据,符合原代码做法)。

复杂度分析

  • 时间复杂度:只对数组进行了一次线性扫描,从索引kn-1,每个元素执行常数次比较和可能的赋值操作,因此总时间复杂度为O(n),其中n是数组长度。

  • 额外空间复杂度:除了几个整型变量(如writePos、循环变量i)外,没有使用任何额外数组或数据结构,所有修改都在原数组上完成。返回的切片只是原数组的一部分引用,不产生新的数据副本。因此额外空间复杂度为O(1)(常数级别)。

Go完整代码如下:

package main

import (
"fmt"
)

func limitOccurrences(nums []int, k int) []int {
stackSize := k // 栈的大小,前 k 个元素默认保留
for i := k; i < len(nums); i++ {
if nums[i] != nums[stackSize-k] { // 和栈的倒数第 k 个数比较
nums[stackSize] = nums[i] // 入栈
stackSize++
}
}
return nums[:stackSize]
}

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

Python完整代码如下:

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

def limit_occurrences(nums, k):
"""
原地修改 nums,使每个不同元素最多出现 k 次,并返回新列表(切片)。
保持原数组的相对顺序,要求 nums 已按升序排列。
"""
if k <= 0:
return [] # 无效 k,返回空列表(可按需调整)
if len(nums) <= k:
return nums[:] # 长度不足,无需修改,返回副本

stack_size = k # 结果区域大小,初始保留前 k 个元素
for i in range(k, len(nums)):
# 比较当前元素与结果区中倒数第 k 个元素
if nums[i] != nums[stack_size - k]:
nums[stack_size] = nums[i]
stack_size += 1
return nums[:stack_size]

def main():
nums = [1, 1, 1, 2, 2, 3]
k = 2
result = limit_occurrences(nums, k)
print(result)

if __name__ == "__main__":
main()

C++完整代码如下:

  



/**
* 原地修改 nums,使每个不同元素最多出现 k 次,
* 返回一个新的 vector,包含处理后的有效元素。
* 要求 nums 已按升序排列。
*/
std::vector limitOccurrences(std::vector& nums, int k) {
// 处理 k <= 0 的情况(原 Go 未处理,这里增加防御)
if (k <= 0) {
return {};
}

int n = static_cast(nums.size());
if (n <= k) {
// 长度不足,直接返回原数组副本
return nums;
}

int stackSize = k; // 结果区域大小,前 k 个元素默认保留
for (int i = k; i < n; ++i) {
// 比较当前元素与结果区中倒数第 k 个元素
if (nums[i] != nums[stackSize - k]) {
nums[stackSize] = nums[i]; // 入栈(原地覆盖)
++stackSize;
}
}

// 返回有效部分构成的 vector
return std::vector(nums.begin(), nums.begin() + stackSize);
}

int main() {
std::vector nums = {1, 1, 1, 2, 2, 3};
int k = 2;

std::vector result = limitOccurrences(nums, k);

// 输出结果
for (int x : result) {
std::cout << x << " ";
}
std::cout << std::endl;

return 0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
美媒急了:中国重型战斗机数量超北约总和,美军连一半都不到

美媒急了:中国重型战斗机数量超北约总和,美军连一半都不到

瞩望云霄
2026-08-30 20:03:02
开豪车住别墅打造“富婆”人设!网红“曲靖丽姐”涉嫌刑案被警方调查

开豪车住别墅打造“富婆”人设!网红“曲靖丽姐”涉嫌刑案被警方调查

红星新闻
2026-09-01 15:28:36
申花泰山耻辱出局!媒体人开炮:涉案扣分不是能够掩盖一切的理由

申花泰山耻辱出局!媒体人开炮:涉案扣分不是能够掩盖一切的理由

奥拜尔
2026-09-01 21:55:57
宇树科技员工爆 “惊人内幕”,王兴兴天塌了!

宇树科技员工爆 “惊人内幕”,王兴兴天塌了!

营销报
2026-09-01 21:23:58
爱沙尼亚情报局长:俄罗斯内部剧变或在一夜间发生

爱沙尼亚情报局长:俄罗斯内部剧变或在一夜间发生

名人苟或
2026-09-01 17:41:48
28岁内地女主播诬告强奸在澳门被捕,因与男子发生性关系索2万港元未果

28岁内地女主播诬告强奸在澳门被捕,因与男子发生性关系索2万港元未果

可达鸭面面观
2026-08-31 13:50:36
沧州市教育局,你也太丢人了!

沧州市教育局,你也太丢人了!

新区晚参
2026-09-01 11:59:29
刘亦菲妈妈近照曝光!67岁仍优雅,戴百万手镯,无惧和陈金飞绯闻

刘亦菲妈妈近照曝光!67岁仍优雅,戴百万手镯,无惧和陈金飞绯闻

叶公子
2026-09-01 13:02:38
曝科大讯飞高管出轨女下属,大尺度聊天曝光,女方很漂亮,两人多次开房

曝科大讯飞高管出轨女下属,大尺度聊天曝光,女方很漂亮,两人多次开房

180视角
2026-09-01 13:38:02
中国男篮确认:杨瀚森将缺席后续所有世预赛

中国男篮确认:杨瀚森将缺席后续所有世预赛

环球网资讯
2026-09-01 14:05:25
失控!孙宇晨或保不住了!

失控!孙宇晨或保不住了!

财经要参
2026-09-01 07:20:14
武汉街头正大量出现,20岁大学生一个月赚了7000元;有人半天花掉两三百元,“这钱花得值”

武汉街头正大量出现,20岁大学生一个月赚了7000元;有人半天花掉两三百元,“这钱花得值”

极目新闻
2026-09-01 13:04:24
皇马将西藏与尼泊尔并列拒绝改正

皇马将西藏与尼泊尔并列拒绝改正

第一财经资讯
2026-09-02 00:11:54
苹果新CEO上任首日!新iPhone被曝恢复赠送充电头、有线耳机 官方回应

苹果新CEO上任首日!新iPhone被曝恢复赠送充电头、有线耳机 官方回应

快科技
2026-09-02 00:50:09
媒体曝宇树超100元报销都需王兴兴批,员工称奖惩机制只有罚几乎没有奖

媒体曝宇树超100元报销都需王兴兴批,员工称奖惩机制只有罚几乎没有奖

金融界
2026-09-01 14:17:17
联邦警卫局第4次扩编,普京:他们会绞死我

联邦警卫局第4次扩编,普京:他们会绞死我

西楼饮月
2026-09-01 19:21:39
意在施压英国增加国防开支?英媒:特朗普首度公开介入,称正重审美国在马岛争端立场

意在施压英国增加国防开支?英媒:特朗普首度公开介入,称正重审美国在马岛争端立场

环球网资讯
2026-09-01 18:10:36
孙宇晨和景甜的瓜反转了,大量照片和聊天记录流出!

孙宇晨和景甜的瓜反转了,大量照片和聊天记录流出!

七阿姨爱八卦
2026-09-01 10:46:18
“小红书Agency”2026的进阶之道:行业化

“小红书Agency”2026的进阶之道:行业化

刀姐doris
2026-08-27 17:22:54
22页出轨PDF疯传,内容相当劲爆!

22页出轨PDF疯传,内容相当劲爆!

车轱辘话V
2026-09-01 11:24:27
2026-09-02 05:56:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1430文章数 80关注度
往期回顾 全部

科技要闻

抖音突发推荐算法大面积错乱!

头条要闻

美国银行副总裁在纽约时代广场被刺身亡 年仅32岁

头条要闻

美国银行副总裁在纽约时代广场被刺身亡 年仅32岁

体育要闻

大爹杨瀚森,让中国男篮有了容错空间

娱乐要闻

孙宇晨破防,他无法接受孙割这个名字

财经要闻

"电梯亲热门"后 惠州首富给老婆转238亿

汽车要闻

山城试驾启源Q06 不光是智驾好用还有700km的续航

态度原创

数码
房产
手机
教育
时尚

数码要闻

高通发布跃龙Q-2390、IQ-2390物联网处理器

房产要闻

1.72万/㎡!断供十余年,科学城核心区终于开仓了!

手机要闻

库克发文告别苹果CEO一职,称对Apple社区的热爱永远不会改变

教育要闻

人们为什么说用金钱威胁子女是最愚蠢的一种教育方式?

夏天别总穿黑色裤子,试试这几款高腰裙,显瘦优雅又提气质

无障碍浏览 进入关怀版