news 2026/6/26 4:00:21

阿里研发岗 0530笔试真题-字符串等频递增变换(详细思路+多语言题解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
阿里研发岗 0530笔试真题-字符串等频递增变换(详细思路+多语言题解)

字符串等频递增变换

阿里研发岗 0530笔试 第三题

题目内容

在蝴蝶悲园里,有一串写着小写字母的标牌。
你拿到一个长度为nnn的字符串sss(下标从111nnn)。
你需要对字符串做kkk次 “操作”。
一次操作的过程如下:你从左到右依次处理i=1,2,…,ni=1,2,\dots,ni=1,2,,n
在一次操作中,按i=1,2,…,ni=1,2,\dots,ni=1,2,,n的顺序依次处理每个位置,每个位置的修改将立即生效并影响后续位置的统计:

  • ccc为当前位置iii的字符;
  • xxx为位置111i−1i-1i1中当前字符等于ccc的数量;
  • yyy为位置i+1i+1i+1nnn中当前字符等于ccc的数量;
  • x=yx = yx=y,则将位置iii的字符修改为字母表中的下一个字母('z'变为'a'),否则保持不变。
    现在我们将按顺序执行kkk次操作,请你输出做完kkk次操作后的最终字符串。

输入描述

每个测试文件均包含多组测试数据。

  • 第一行输入一个整数
    t (1≤t≤2×105)t\ (1 \le t \le 2 \times 10^5)t(1t2×105)
    代表数据组数,每组测试数据描述如下:
  1. 第一行输入两个整数nnnkkk(1≤n≤105; 1≤k≤105)(1 \le n \le 10^5;\ 1 \le k \le 10^5)(1n105;1k105),分别表示字符串长度与操作次数。
  2. 第二行输入一个长度为nnn的字符串sss,保证仅由小写英文字母组成。
  • 除此之外,保证单个测试文件的nnn之和不超过10510^5105kkk之和不超过10510^5105

输出描述

对于每一组测试数据,新起一行输出做完kkk次操作后的最终字符串。

样例1

输入

2 2 1 ab 3 2 abc

输出

bb bbe

题解

思路

逻辑分析

  1. 一个位置可以发生改变的条件左侧c字符 == 右侧c字符的数量其实可以转换为左侧c的数量 == c的总数量 - 左侧c的数量 -1
  2. 按照1的规律可以预统计初始input中各个字符的数量使用tot的数量
  3. 在每一轮中从前往后过程中cnt统计{0, i-1}中各种字符的数量,当cnt[c] == tot[c] - cnt[c] -1时更新对应位置字符以及更新tot中的字符数量即可

C++

#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intT;cin>>T;while(T--){intn,k;cin>>n>>k;string s;cin>>s;vector<int>tot(26,0);for(charc:s){tot[c-'a']++;}while(k--){vector<int>cnt(26,0);for(inti=0;i<n;i++){intc=s[i]-'a';intx=cnt[c];inty=tot[c]-cnt[c]-1;if(x==y){tot[c]--;c=(c+1)%26;tot[c]++;}// 更新当前字符s[i]=char('a'+c);cnt[s[i]-'a']++;}}cout<<s<<"\n";}return0;}

java

importjava.io.*;importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));StringBuilderout=newStringBuilder();intT=Integer.parseInt(br.readLine());while(T-->0){String[]nk=br.readLine().split(" ");intn=Integer.parseInt(nk[0]);intk=Integer.parseInt(nk[1]);Strings=br.readLine();char[]arr=s.toCharArray();int[]tot=newint[26];for(charc:arr){tot[c-'a']++;}while(k-->0){int[]cnt=newint[26];for(inti=0;i<n;i++){intc=arr[i]-'a';intx=cnt[c];inty=tot[c]-cnt[c]-1;if(x==y){tot[c]--;c=(c+1)%26;tot[c]++;}arr[i]=(char)('a'+c);cnt[arr[i]-'a']++;}}out.append(newString(arr)).append('\n');}System.out.print(out);}}

python

importsysinput=sys.stdin.readline T=int(input())for_inrange(T):n,k=map(int,input().split())s=list(input().strip())tot=[0]*26forcins:tot[ord(c)-97]+=1whilek>0:k-=1cnt=[0]*26foriinrange(n):c=ord(s[i])-97x=cnt[c]y=tot[c]-cnt[c]-1ifx==y:tot[c]-=1c=(c+1)%26tot[c]+=1s[i]=chr(c+97)cnt[c]+=1print("".join(s))

javascript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinput=[];rl.on('line',(line)=>{input.push(line.trim());});rl.on('close',()=>{letidx=0;letT=Number(input[idx++]);letout=[];while(T--){let[n,k]=input[idx++].split(' ').map(Number);lets=input[idx++].split('');lettot=newArray(26).fill(0);for(letcofs){tot[c.charCodeAt(0)-97]++;}while(k--){letcnt=newArray(26).fill(0);for(leti=0;i<n;i++){letc=s[i].charCodeAt(0)-97;letx=cnt[c];lety=tot[c]-cnt[c]-1;if(x===y){tot[c]--;c=(c+1)%26;tot[c]++;}s[i]=String.fromCharCode(c+97);cnt[c]++;}}out.push(s.join(''));}console.log(out.join('\n'));});

Go

packagemainimport("bufio""fmt""os")funcmain(){in:=bufio.NewReader(os.Stdin)out:=bufio.NewWriter(os.Stdout)deferout.Flush()varTintfmt.Fscan(in,&T)forT>0{T--varn,kintfmt.Fscan(in,&n,&k)varsstringfmt.Fscan(in,&s)arr:=[]byte(s)tot:=make([]int,26)fori:=0;i<n;i++{tot[arr[i]-'a']++}fork>0{k--cnt:=make([]int,26)fori:=0;i<n;i++{c:=int(arr[i]-'a')x:=cnt[c]y:=tot[c]-cnt[c]-1ifx==y{tot[c]--c=(c+1)%26tot[c]++}arr[i]=byte(c+'a')cnt[int(arr[i]-'a')]++}}fmt.Fprintln(out,string(arr))}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 8:00:59

你敢让AI动你的祖传代码吗?Claude Code 的重构方案让我意外了

大家好&#xff0c;我是小悟。 一、详细描述 Claude Code 是 Anthropic 推出的智能编程助手&#xff0c;它并非简单的代码补全工具&#xff0c;而是一个能理解复杂上下文、进行多步推理、主动解决问题的“结对编程伙伴”。在实际开发中&#xff0c;Claude Code 主要攻克以下几类…

作者头像 李华
网站建设 2026/6/15 23:39:57

电路可靠性设计实战:从元器件选型到系统测试的完整指南

1. 从“测不出”到“测得准”&#xff1a;可靠性测试的实战心法上次我们聊了电路可靠性设计的宏观思路和基础原则&#xff0c;算是把“渔”给了大家。今天咱们来点更“硬核”的&#xff0c;直接上手“捕鱼”——也就是可靠性测试和元器件选型。很多工程师朋友跟我诉苦&#xff…

作者头像 李华
网站建设 2026/6/14 6:57:36

深入解析MSI文件与Windows Installer:从安装原理到工程实践

1. MSI文件与Windows Installer&#xff1a;不只是安装程序在工程师的日常工作中&#xff0c;无论是部署开发环境、安装EDA工具&#xff0c;还是配置测试测量软件&#xff0c;我们总会遇到各种安装包。其中&#xff0c;.msi后缀的文件尤为常见。很多朋友可能只是双击运行&#…

作者头像 李华
网站建设 2026/6/14 0:41:55

164个开箱即用的Java练习项目,覆盖从入门到进阶全场景

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;这套Java代码合集包含164个完整可运行的小型程序&#xff0c;每个都能独立编译执行&#xff0c;无需额外配置。内容涵盖变量与运算符、流程控制、数组与字符串、类与对象、继承与多态、接口与抽象类、泛型与集合…

作者头像 李华
网站建设 2026/6/14 6:57:33

EdgeRemover:Windows 10/11上安全卸载Microsoft Edge的完整解决方案

EdgeRemover&#xff1a;Windows 10/11上安全卸载Microsoft Edge的完整解决方案 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemo…

作者头像 李华