手机上如何做微电影网站,解决方案网站,百度广告联盟赚广告费,wordpress上面的模板2025-12-17#xff1a;优惠券校验器。用go语言#xff0c;你有三个等长数组 code、businessLine 和 isActive#xff0c;分别记录 n 个优惠券的标识符、所属业务线和是否有效。
把某张券视为“合格”的条件是#xff1a;标识符非空且只包含字母、数字或下划线#xff1b;所…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”,“SAVE20”], businessLine [“restaurant”,“grocery”,“pharmacy”,“restaurant”], isActive [true,true,true,true]。输出 [“PHARMA5”,“SAVE20”]。解释第一个优惠券有效。第二个优惠券的标识符为空无效。第三个优惠券有效。第四个优惠券的标识符包含特殊字符 无效。题目来自力扣3606。步骤描述初始化容器程序创建了一个长度为 4 的切片groups里面每个元素是一个字符串切片对应 4 个业务线的分组顺序groups[0]→ electronicsgroups[1]→ grocerygroups[2]→ pharmacygroups[3]→ restaurant另外还创建一个空的ans切片用于存放最终结果。遍历输入数据依次对每个 i (0 ≤ i n) 做以下判断检查code[i]是否非空字符串。调用check函数判断code[i]是否只包含字母、数字或下划线并且isActive[i]为 true。check内部遍历code[i]的每个字符用unicode.IsLetter和unicode.IsDigit判断如果出现非字母/数字/下划线则返回 false。如果check返回 true说明券是“合格”的。对合格的券根据businessLine[i]决定放入哪个分组如果是electronics放入groups[0]如果是grocery放入groups[1]如果是pharmacy放入groups[2]如果是restaurant放入groups[3]不合格的券包括空字符串、非法字符、业务线不匹配但题中业务线只有四种合法如果给的业务线不在四个之中则不放入代码中switch默认不处理就忽略。分组内部排序遍历groups里的四个切片对每个业务线分组内的标识符列表调用sort.Strings进行字典序排序。结果合并按顺序electronics → grocery → pharmacy → restaurant将每个分组排序后的内容依次追加到ans中。返回结果最终ans就是按照先业务线固定顺序、再组内字典序排列的所有合格券标识符列表。在给定输入的例子中SAVE20→ 合格业务线restaurant→ 放入groups[3]→ 空字符串 → 不合格PHARMA5→ 合格业务线pharmacy→ 放入groups[2]SAVE20→ 包含字符 → 不合格最后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(fmtsortunicode)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;ilen(code);i{ifcode[i]!check(code[i],isActive[i]){switchbusinessLine[i]{caseelectronics:groups[0]append(groups[0],code[i])casegrocery:groups[1]append(groups[1],code[i])casepharmacy:groups[2]append(groups[2],code[i])caserestaurant:groups[3]append(groups[3],code[i])}}}for_,group:rangegroups{sort.Strings(group)ansappend(ans,group...)}returnans}funcmain(){code:[]string{SAVE20,,PHARMA5,SAVE20}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]):bizbusiness_line[i]# 如果业务线在预定义列表中则添加到对应分组ifbizingroups:groups[biz].append(code[i])# 对每个分组进行排序并按顺序合并结果result[]forbizinbusiness_order:groups[biz].sort()result.extend(groups[biz])returnresultdefmain():# 测试数据code[SAVE20,,PHARMA5,SAVE20]business_line[restaurant,grocery,pharmacy,restaurant]is_active[True,True,True,True]# 调用验证函数resultvalidate_coupons(code,business_line,is_active)# 输出结果print(result)# 预期输出: [SAVE20] (因为: 为空, SAVE20包含非法字符, 只有SAVE20和PHARMA5有效但PHARMA5属于pharmacy分组排在restaurant之后)if__name____main__:main()C完整代码如下#includeiostream#includevector#includestring#includealgorithm#includecctypeusingnamespacestd;boolcheck(conststringcode,boolisActive){// 检查优惠码是否只包含字母、数字和下划线for(charc:code){if(c!_!isalnum(c)){returnfalse;}}returnisActive;}vectorstringvalidateCoupons(constvectorstringcode,constvectorstringbusinessLine,constvectorboolisActive){// 初始化4个分组对应electronics, grocery, pharmacy, restaurantvectorvectorstringgroups(4);vectorstringresult;for(size_t i0;icode.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(autogroup:groups){sort(group.begin(),group.end());for(constautocoupon:group){result.push_back(coupon);}}returnresult;}intmain(){vectorstringcode{SAVE20,,PHARMA5,SAVE20};vectorstringbusinessLine{restaurant,grocery,pharmacy,restaurant};vectorboolisActive{true,true,true,true};vectorstringresultvalidateCoupons(code,businessLine,isActive);// 输出结果cout[;for(size_t i0;iresult.size();i){cout\result[i]\;if(i!result.size()-1){cout, ;}}cout]endl;return0;}