news 2026/4/18 7:37:50

2025-12-17:优惠券校验器。用go语言,你有三个等长数组 code、businessLine 和 isActive,分别记录 n 个优惠券的标识符、所属业务线和是否有效。 把某张券视为“合格”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2025-12-17:优惠券校验器。用go语言,你有三个等长数组 code、businessLine 和 isActive,分别记录 n 个优惠券的标识符、所属业务线和是否有效。 把某张券视为“合格”

2025-12-17:优惠券校验器。用go语言,你有三个等长数组 code、businessLine 和 isActive,分别记录 n 个优惠券的标识符、所属业务线和是否有效。

把某张券视为“合格”的条件是:标识符非空且只包含字母、数字或下划线;所属业务线为四种中的一种:“electronics”、“grocery”、“pharmacy” 或 “restaurant”;并且 isActive 为 true。

结果应返回所有合格券的标识符组成的列表,排序规则是先按业务线的固定顺序(electronics → grocery → pharmacy → restaurant)分组,然后在每个组内按标识符的字典序从小到大排列。

n == code.length == businessLine.length == isActive.length。

1 <= n <= 100。

0 <= code[i].length, businessLine[i].length <= 100。

code[i] 和 businessLine[i] 由可打印的 ASCII 字符组成。

isActive[i] 的值为 true 或 false。

输入: code = [“SAVE20”,“”,“PHARMA5”,“SAVE@20”], businessLine = [“restaurant”,“grocery”,“pharmacy”,“restaurant”], isActive = [true,true,true,true]。

输出: [“PHARMA5”,“SAVE20”]。

解释:

第一个优惠券有效。

第二个优惠券的标识符为空(无效)。

第三个优惠券有效。

第四个优惠券的标识符包含特殊字符 @(无效)。

题目来自力扣3606。

步骤描述

  1. 初始化容器
    程序创建了一个长度为 4 的切片groups,里面每个元素是一个字符串切片,对应 4 个业务线的分组顺序:

    • groups[0]→ electronics
    • groups[1]→ grocery
    • groups[2]→ pharmacy
    • groups[3]→ restaurant
      另外还创建一个空的ans切片,用于存放最终结果。
  2. 遍历输入数据
    依次对每个 i (0 ≤ i < n) 做以下判断:

    • 检查code[i]是否非空字符串。
    • 调用check函数判断code[i]是否只包含字母、数字或下划线,并且isActive[i]为 true。
      • check内部遍历code[i]的每个字符,用unicode.IsLetterunicode.IsDigit判断,如果出现非字母/数字/下划线则返回 false。
      • 如果check返回 true,说明券是“合格”的。
    • 对合格的券,根据businessLine[i]决定放入哪个分组:
      • 如果是"electronics",放入groups[0]
      • 如果是"grocery",放入groups[1]
      • 如果是"pharmacy",放入groups[2]
      • 如果是"restaurant",放入groups[3]
    • 不合格的券(包括空字符串、非法字符、业务线不匹配(但题中业务线只有四种合法,如果给的业务线不在四个之中则不放入,代码中switch默认不处理))就忽略。
  3. 分组内部排序
    遍历groups里的四个切片,对每个业务线分组内的标识符列表调用sort.Strings进行字典序排序。

  4. 结果合并
    按顺序(electronics → grocery → pharmacy → restaurant)将每个分组排序后的内容依次追加到ans中。

  5. 返回结果
    最终ans就是按照先业务线固定顺序、再组内字典序排列的所有合格券标识符列表。

在给定输入的例子中

  • "SAVE20"→ 合格,业务线"restaurant"→ 放入groups[3]
  • ""→ 空字符串 → 不合格
  • "PHARMA5"→ 合格,业务线"pharmacy"→ 放入groups[2]
  • "SAVE@20"→ 包含@字符 → 不合格
    最后:
  • groups[2]排序后为["PHARMA5"]
  • groups[3]排序后为["SAVE20"]
    electronics组(空)→grocery组(空)→pharmacy组("PHARMA5")→restaurant组("SAVE20"
    最终结果:["PHARMA5", "SAVE20"]

时间复杂度分析

  • 遍历 n 张券:O(n)
  • 对每个券,check函数要遍历其标识符的每个字符,设所有code[i]总长度为 L,则总检查字符次数为 O(L)
  • 分组内部排序:最多 n 个字符串,分成 4 组,最坏情况(所有合格券在同一组)需要对该组 m 个字符串排序,比较开销是 O(m log m),m ≤ n,所以排序总时间 O(n log n)(因为 4 组总和 ≤ n,每组排序复杂度相加 ≤ n log n 级别)
  • 最终遍历 groups 合并结果 O(n)
    总时间复杂度O(L + n log n),其中 L 是所有code[i]字符总数。

空间复杂度分析

  • groups数组及其内部切片存储所有合格券标识符,总空间 O(n)
  • 排序可能需额外 O(log n) 递归栈空间(Go 的sort.Strings用快速排序)
  • 结果ans额外存储 n 个字符串引用(和groups里的引用相同,不重复占用字符串本身空间,但切片结构占用 O(n))
  • 因此总额外空间复杂度O(n)(主要是存储合格券标识符的引用和分组结构,不包括输入数据占用的空间)。

Go完整代码如下:

packagemainimport("fmt""sort""unicode")funccheck(codestring,isActivebool)bool{for_,c:=rangecode{ifc!='_'&&!unicode.IsLetter(c)&&!unicode.IsDigit(c){returnfalse}}returnisActive}funcvalidateCoupons(code[]string,businessLine[]string,isActive[]bool)[]string{groups:=make([][]string,4)fori:=rangegroups{groups[i]=make([]string,0)}ans:=make([]string,0)fori:=0;i<len(code);i++{ifcode[i]!=""&&check(code[i],isActive[i]){switchbusinessLine[i]{case"electronics":groups[0]=append(groups[0],code[i])case"grocery":groups[1]=append(groups[1],code[i])case"pharmacy":groups[2]=append(groups[2],code[i])case"restaurant":groups[3]=append(groups[3],code[i])}}}for_,group:=rangegroups{sort.Strings(group)ans=append(ans,group...)}returnans}funcmain(){code:=[]string{"SAVE20","","PHARMA5","SAVE@20"}businessLine:=[]string{"restaurant","grocery","pharmacy","restaurant"}isActive:=[]bool{true,true,true,true}result:=validateCoupons(code,businessLine,isActive)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-importrefromtypingimportListdefcheck(code:str,is_active:bool)->bool:"""检查优惠码是否只包含字母、数字和下划线,并且处于激活状态"""ifnotcode:returnFalse# 使用正则表达式检查是否只包含字母、数字和下划线ifnotre.fullmatch(r'[\w]+',code):returnFalsereturnis_activedefvalidate_coupons(code:List[str],business_line:List[str],is_active:List[bool])->List[str]:"""验证优惠码并按业务线分类排序"""# 定义业务线分组顺序business_order=["electronics","grocery","pharmacy","restaurant"]# 初始化分组字典groups={biz:[]forbizinbusiness_order}# 遍历所有优惠码foriinrange(len(code)):# 验证优惠码ifcheck(code[i],is_active[i]):biz=business_line[i]# 如果业务线在预定义列表中,则添加到对应分组ifbizingroups:groups[biz].append(code[i])# 对每个分组进行排序,并按顺序合并结果result=[]forbizinbusiness_order:groups[biz].sort()result.extend(groups[biz])returnresultdefmain():# 测试数据code=["SAVE20","","PHARMA5","SAVE@20"]business_line=["restaurant","grocery","pharmacy","restaurant"]is_active=[True,True,True,True]# 调用验证函数result=validate_coupons(code,business_line,is_active)# 输出结果print(result)# 预期输出: ['SAVE20'] (因为: ""为空, "SAVE@20"包含非法字符, 只有"SAVE20"和"PHARMA5"有效,但"PHARMA5"属于pharmacy分组排在restaurant之后)if__name__=="__main__":main()

C++完整代码如下:

#include<iostream>#include<vector>#include<string>#include<algorithm>#include<cctype>usingnamespacestd;boolcheck(conststring&code,boolisActive){// 检查优惠码是否只包含字母、数字和下划线for(charc:code){if(c!='_'&&!isalnum(c)){returnfalse;}}returnisActive;}vector<string>validateCoupons(constvector<string>&code,constvector<string>&businessLine,constvector<bool>&isActive){// 初始化4个分组,对应electronics, grocery, pharmacy, restaurantvector<vector<string>>groups(4);vector<string>result;for(size_t i=0;i<code.size();i++){// 验证优惠码if(!code[i].empty()&&check(code[i],isActive[i])){// 根据业务线添加到对应分组if(businessLine[i]=="electronics"){groups[0].push_back(code[i]);}elseif(businessLine[i]=="grocery"){groups[1].push_back(code[i]);}elseif(businessLine[i]=="pharmacy"){groups[2].push_back(code[i]);}elseif(businessLine[i]=="restaurant"){groups[3].push_back(code[i]);}}}// 对每个分组排序并合并结果for(auto&group:groups){sort(group.begin(),group.end());for(constauto&coupon:group){result.push_back(coupon);}}returnresult;}intmain(){vector<string>code={"SAVE20","","PHARMA5","SAVE@20"};vector<string>businessLine={"restaurant","grocery","pharmacy","restaurant"};vector<bool>isActive={true,true,true,true};vector<string>result=validateCoupons(code,businessLine,isActive);// 输出结果cout<<"[";for(size_t i=0;i<result.size();i++){cout<<"\""<<result[i]<<"\"";if(i!=result.size()-1){cout<<", ";}}cout<<"]"<<endl;return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:01:50

AXI-A7.4.10 Support for Atomic transactions(2)

Manager support 该部分描述了AXI协议中,管理器(Manager,如CPU、DMA等主设备)对原子事务的一种向后兼容性支持机制。其核心在于,即使一个管理器本身具备发起原子事务的能力,它也可以被配置为不发起这类事务,以确保在不支持原子操作的旧系统中能正常工作。这是通过一个可…

作者头像 李华
网站建设 2026/4/18 5:32:00

币安加密货币数据 (Crypto Market)对接指南

与股票接口不同&#xff0c;加密货币接口对接币安 (Binance) 数据&#xff0c;使用 Symbol (如 BTCUSDT) 作为唯一标识&#xff0c;且 K 线数据的返回格式为数组格式&#xff08;而非对象格式&#xff09;&#xff0c;这一点在解析时需要特别注意。StockTV API 对接文档&#x…

作者头像 李华
网站建设 2026/4/18 4:24:01

介观交通流仿真软件:Aimsun Next_(8).交通控制设备建模

交通控制设备建模 在交通仿真软件中&#xff0c;交通控制设备的建模是确保仿真结果准确性和实用性的关键步骤之一。Aimsun Next 提供了丰富的工具和方法来建模各种交通控制设备&#xff0c;包括信号灯、可变限速标志、检测器等。本节将详细介绍如何在 Aimsun Next 中进行交通控…

作者头像 李华
网站建设 2026/4/17 8:31:35

介观交通流仿真软件:DynusT_(5).交通需求分析

交通需求分析 在交通仿真软件中&#xff0c;交通需求分析是至关重要的一步&#xff0c;它决定了仿真模型的输入数据和仿真结果的可靠性。交通需求分析主要包括交通需求预测、交通流量分配、交通需求管理等。本节将详细介绍如何在介观交通流仿真软件中进行交通需求分析&#xff…

作者头像 李华
网站建设 2026/4/18 4:24:48

Dify 1.7.0音频功能瓶颈突破(音频时长限制终极应对策略)

第一章&#xff1a;Dify 1.7.0音频功能瓶颈突破&#xff08;音频时长限制终极应对策略&#xff09;Dify 1.7.0 版本在语音处理能力上实现了显著增强&#xff0c;但仍存在单次音频上传时长上限为60秒的硬性限制。这一约束对需要处理长语音的应用场景构成挑战。通过合理的技术拆分…

作者头像 李华