新闻详情

新闻详情

首页 / 资讯中心 / 详情

2026-09-26:求和后首尾数字相同的有效子数组Ⅰ。用go语言,有一个整数数组 nums,还有一个目标数字 x。需要统计所有连续且非空的子数组:先把子数组中的元素全部相加,得到总和;再看这个总和的

发布时间:2026/9/27 22:57:10来源:尧图网络
2026-09-26:求和后首尾数字相同的有效子数组Ⅰ。用go语言,有一个整数数组 nums,还有一个目标数字 x。需要统计所有连续且非空的子数组:先把子数组中的元素全部相加,得到总和;再看这个总和的
2026-09-26求和后首尾数字相同的有效子数组Ⅰ。用go语言有一个整数数组 nums还有一个目标数字 x。需要统计所有连续且非空的子数组先把子数组中的元素全部相加得到总和再看这个总和的十进制表示如果最左边的数字和最右边的数字都等于 x那么这个子数组就符合要求。最后返回符合要求的子数组总数。1 nums.length 1500。1 nums[i] 1000000000。1 x 9。输入 nums [1,100,1], x 1。输出 4。解释有效子数组为nums[0…0]sum 1nums[0…1]sum 1 100 101nums[1…2]sum 100 1 101nums[2…2]sum 1因此答案为 4。题目来自力扣3969。大体步骤如下一、预处理前缀和先构造一个前缀和数组。前缀和数组的第 0 项为 0第 i 项表示原数组中前 i 个元素的总和。这样任意一个连续非空子数组的元素和都可以表示成两个前缀和相减。题目要求统计有效子数组数量就等价于统计有多少对前缀和它们的差值满足条件。二、拆解两个条件一个子数组的和要同时满足末位数字等于 x。这等价于该子数组和对 10 取模的结果等于 x。首位数字等于 x。一个正整数的首位数字等于 x意味着这个数落在若干个十进制区间中。具体来说对于每一个非负整数 k和必须落在从 x 乘以 10 的 k 次方到 (x1) 乘以 10 的 k 次方再减 1这个闭区间内。例如 x1 时区间依次是 [1,1]、[10,19]、[100,199]、[1000,1999] 等。三、外层枚举首位数字对应的区间从最小的情况开始令区间下界为 x上界为 x1。然后每次把下界和上界都乘以 10得到下一个十进制长度对应的区间。只要下界不超过整个数组的总和就说明还可能存在子数组和落在这个区间内于是处理这个区间。处理完后继续扩大十倍直到下界超过总和为止。四、内层用滑动窗口统计每个区间内的有效子数组对于当前枚举到的区间需要统计有多少对前缀和满足右端前缀和减去左端前缀和结果落在当前区间内这个差值对 10 取模等于 x。具体做法是依次把每一个前缀和当作右端前缀和。设当前右端前缀和为 s。那么左端前缀和 t 必须满足s 减去 t 的结果在当前区间内也就是 t 要落在某个由 s 和当前区间边界共同决定的范围内t 对 10 取模的值必须等于 s 减去 x 后对 10 取模的值。因为只有这样s 减 t 的末位才会是 x。由于原数组中的元素都是正整数所以前缀和数组是严格递增的。对于不断增大的右端前缀和 s满足数值范围条件的左端前缀和区间也会单调向右移动。因此可以用两个指针来维护这个窗口一个指针负责把已经小于等于某个下界的前缀和移出窗口另一个指针负责把小于等于某个上界的前缀和加入窗口。同时用一个长度为 10 的计数数组记录当前窗口内各个前缀和模 10 的出现次数。每处理一个右端前缀和 s就查询计数数组中模 10 等于目标值的次数这个次数就是以 s 为右端、满足当前区间和末位条件的有效左端前缀和数量。把它累加到答案中。五、重复处理所有区间对每一个由首位数字条件产生的区间都重新执行一次上述滑动窗口统计。不同区间之间互不影响最后把所有区间统计到的数量相加就是最终有效子数组的总数。六、为什么不会统计到空子数组因为原数组元素都为正数前缀和严格递增。对于当前右端前缀和 s窗口中加入的左端前缀和一定小于 s所以对应的子数组长度至少为 1不会出现空子数组。七、复杂度分析时间复杂度外层枚举的区间数量大约是所有元素总和的对数级别即 O(log10(总和)) 次。内层每个区间都要遍历所有前缀和一次并且两个指针各自单调移动总移动次数与前缀和数量同阶。因此每个区间的时间是 O(n)。总时间复杂度为 O(n × log10(总和))。由于总和最大约为 1500 × 10^9对数很小实际接近 O(n)。额外空间复杂度主要需要一个前缀和数组长度为 n1因此额外空间是 O(n)。滑动窗口中的计数数组长度固定为 10指针等变量都是常数个所以除前缀和数组外只用了 O(1) 的辅助空间。总额外空间复杂度为 O(n)。Go完整代码如下packagemainimport(fmt)funccountValidSubarrays(nums[]int,xint)(ansint){n:len(nums)sum:make([]int,n1)fori,v:rangenums{sum[i1]sum[i]v}// 枚举子数组和的十进制长度forlow,high:x,x1;lowsum[n];low,highlow*10,high*10{// 计算子数组和在 [low, high-1] 中且子数组和模 10 为 x 的子数组个数cnt:[10]int{}left1,left2:0,0for_,s:rangesum{// 随着 s 的增大 s-high 的前缀和离开窗口 s-low 的前缀和进入窗口forsum[left1]s-high{cnt[sum[left1]%10]--left1}forsum[left2]s-low{cnt[sum[left2]%10]left2}anscnt[(s-x10)%10]}}return}funcmain(){nums:[]int{1,100,1}x:1result:countValidSubarrays(nums,x)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defcount_valid_subarrays(nums,x):nlen(nums)pref[0]*(n1)fori,vinenumerate(nums):pref[i1]pref[i]v ans0low,highx,x1totalpref[-1]whilelowtotal:cnt[0]*10left1left20forsinpref:whilepref[left1]s-high:cnt[pref[left1]%10]-1left11whilepref[left2]s-low:cnt[pref[left2]%10]1left21anscnt[(s-x)%10]low*10high*10returnansif__name____main__:nums[1,100,1]x1resultcount_valid_subarrays(nums,x)print(result)C完整代码如下#includeiostream#includevectorusingnamespacestd;intcountValidSubarrays(constvectorintnums,intx){intnnums.size();vectorlonglongsum(n1,0);for(inti0;in;i){sum[i1]sum[i]nums[i];}intans0;// 枚举子数组和的十进制长度for(longlonglowx,highx1;lowsum[n];low*10,high*10){// 计算子数组和在 [low, high-1] 中且子数组和模 10 为 x 的子数组个数intcnt[10]{0};intleft10,left20;for(longlongs:sum){// 随着 s 的增大 s-high 的前缀和离开窗口 s-low 的前缀和进入窗口while(sum[left1]s-high){cnt[sum[left1]%10]--;left1;}while(sum[left2]s-low){cnt[sum[left2]%10];left2;}anscnt[((s-x)%1010)%10];}}returnans;}intmain(){vectorintnums{1,100,1};intx1;intresultcountValidSubarrays(nums,x);coutresultendl;return0;}
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

苹果序列号查询全解析:从底层逻辑到二手交易避坑实战 2026/9/27 23:49:49

苹果序列号查询全解析:从底层逻辑到二手交易避坑实战

1. 苹果序列号查询的底层逻辑与核心价值很多人第一次接触“序列号查询”这个概念,是因为买了一台二手 iPhone 或者 Mac,想确认卖家说的“全新未激活”“国行正品”到底靠不靠谱。苹果的序列号就像设备的身份证号,它不只是一串随机字符&#x…

阅读更多 →
Laravel Lang 中库尔德语(ckb)翻译完成度报告:15 个缺失键位全解析与补全指南 2026/9/27 23:49:49

Laravel Lang 中库尔德语(ckb)翻译完成度报告:15 个缺失键位全解析与补全指南

后端 【免费下载链接】lang List of 128 languages for Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova and Laravel UI. 项目地址: https://gitcode.com/gh_mirrors/la/lang 点击查看 免费下载 本指南以…

阅读更多 →
3个坑让你省5万:内蒙古高等级公路建设开发有限责任公司网站对比评测 2026/9/27 23:49:49

3个坑让你省5万:内蒙古高等级公路建设开发有限责任公司网站对比评测

3个坑让你省5万:内蒙古高等级公路建设开发有限责任公司网站对比评测 找建站公司最怕什么?不是功能做不全,而是报价单上那些看不懂的术语,最后结账时才发现多花了几万块冤枉钱。很多老板拿着需求去问价,销售嘴里蹦出“微服务架构”、“全栈云原生”,转…

阅读更多 →
UG数控编程从入门到精通:工艺思维与实战避坑指南 2026/9/27 23:49:49

UG数控编程从入门到精通:工艺思维与实战避坑指南

1. 为什么UG数控编程值得你花时间啃下来干了十几年机加工,从手编宏程序到现在的CAM软件,我最大的感受就是:UG(现在官方叫Siemens NX)在数控编程这块,依然是国内模具、汽车、航空零件加工厂里最硬的那块敲门…

阅读更多 →
基于YOLOv8的多端车流检测系统源码拆解与实战调优 2026/9/27 23:49:43

基于YOLOv8的多端车流检测系统源码拆解与实战调优

简介:本资源是一套基于YOLOv8构建的多端车流检测系统完整源码包,面向计算机视觉学习者、交通监控方向开发者及需要目标检测实战项目的学生与工程师,帮助其快速搭建可运行的车辆流量检测应用。压缩包共396个文件,约16.93MB&#xf…

阅读更多 →
Java数字签名与证书生成实战:从keytool到Bouncy Castle全解析 2026/9/27 23:49:43

Java数字签名与证书生成实战:从keytool到Bouncy Castle全解析

简介:围绕Java数字签名与数字证书的源码示例,面向中高级Java开发者及安全编程初学者,演示如何在网络通信中利用非对称加密保障数据完整性与发送方身份验证。压缩包为RAR格式,体积仅17KB,便于快速下载与阅读&#xff1b…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉