特殊计数法
时间限制: 1 Sec 内存限制: 128 MB提交: 30 解决: 16
题目描述
Tongtong是一个很奇怪的人,他的计算方法跟别人不一样。他是采用小写字母来计数,而不是采用普通数字。每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为tongtong数字。在tongtong数字中,每个字母互不相同,而且从左到右是严格递增的。每次,tongtong还指定使用字母的范围, 例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在tongtong数字“bdfij”之后的数字 应该是“bdghi”。(如果我们用U、V依次表示tongtong数字“bdfij”与“bdghi”,则U<V< span>,且不存在tongtong数字P,使U<P<V< span>)。你的任务是:对于从文件读入的一个tongtong数字,按顺序输出紧接在后面的5个tongtong数字,如果后面没有那么多tongtong数字,那么有几个就 输出几个。
输入
输入格式
有2行,第1行为3个正整数,用一个空格隔开:
s t w
(其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<T≤26, 2≤w≤t-s )
第2行为具有w个小写字母的字符串,为一个符合要求的tongtong数字。
所给的数据都是正确的,不必验证。
输出
最多为5行,为紧接在输入的tongtong数字后面的5个tongtong数字,如果后面没有那么多tongtong数字,那么有几个就输出几个。每行只输出一个tongtong数字,是由w个小写字母组成的字符串,不要有多余的空格。
样例输入
2 10 5 bdfij
样例输出
bdghi bdghj bdgij bdhij befgh
测试数据1
5 20 8
fhijmpqt
输出
fhijmprs
fhijmprt
fhijmpst
fhijmqrs
fhijmqrt
测试数据2
2 14 8
bdefhijm
输出
bdefhijn
bdefhikl
bdefhikm
bdefhikn
bdefhilm
我的想法是把字符串每个字符变成区间内对应的位置下标+1,去作为数组的每一位;
在运行过程种发生以下错误:
他说string下标越界了,可是我看了好几次都没问题;在eclipse上能够正常输出答案;
作为一枚菜鸡,只能想到这种程度了,有没有哪位大神拯救以下我这只菜鸡??头都大了找不粗哪里错误。
1 import java.util.*; 2 3 public class Main{ 4 static String strf="0abcdefghijklmnopqrstuvwxyz"; 5 6 public static void main(String[] args) { 7 Scanner in=new Scanner(System.in); 8 int s=in.nextInt(),t=in.nextInt(),w=in.nextInt(); 9 String strin=in.next(); 10 String strlist=strf.substring(s,t+1);//获取s到t区间的字符; 11 int k=0; 12 int ar[]=tonumbers(strin,strlist);//先对数值型字符串转换数组 13 for(int m=0;;m++) { 14 ar[w-1]++;//每次最后一位++; 15 f(ar,t); 16 if(ben(ar,s,t)) {//符合就输出 17 System.out.println(tostring(ar,strlist)); 18 k++; 19 if(k==5) { 20 return; 21 } 22 } 23 } 24 } 25 static boolean ben(int ar[],int star,int end) {//判断当前数组是否按升序,是否没重复,是否没超过区间 26 int art[]=Arrays.copyOf(ar,ar.length); 27 int s=1,e=(end-star)+1; 28 for(int i=0;i<art.length-1;i++) { 29 if((art[i]>art[i+1])||(art[i]==art[i+1])||(art[i]<s||art[i]>e)) { 30 return false; 31 } 32 } 33 return true; 34 } 35 static void f(int ar[],int end) {//超过end就进位 36 int e=end-1; 37 for(int i=0;i<ar.length;i++) { 38 if(ar[i]>e) { 39 ar[i]=1; 40 ar[i-1]=ar[i-1]+1; 41 } 42 } 43 } 44 static int[] tonumbers(String str,String strlist) {把数值型字符串变成int数组 45 int art[]=new int[str.length()]; 46 for(int i=0;i<art.length;i++) { 47 art[i]=strlist.indexOf(str.charAt(i))+1;//这里是通过获取str中的某个字符在strlist里的位置,从而充当int元素; 48 } 49 return art; 50 } 51 static String tostring(int ar[],String strlist) {//实现把数组转换为字符串 52 String str=""; 53 for(int i=0;i<ar.length;i++) { 54 str+=(strlist.charAt(ar[i]-1)); 55 } 56 return str; 57 } 58 } 59 /************************************************************** 60 Problem: 1993 61 User: 16105190118 62 Language: Java 63 Result: 运行错误
2020-04-0115:33:16 更新
发现难以发现又非常低级的错误;代码更新如下:
1 package bluebriage; 2 import java.util.*; 3 4 public class CheckNum { 5 static String strf="0abcdefghijklmnopqrstuvwxyz"; 6 7 public static void main(String[] args) { 8 Scanner in=new Scanner(System.in); 9 int s=in.nextInt(),t=in.nextInt(),w=in.nextInt(); 10 String strin=in.next(); 11 String strlist=strf.substring(s,t+1); 12 int k=0; 13 int[] ar=tonumbers(strin,strlist); 14 while(true) { 15 ar[w-1]++; 16 f(ar,s,t); 17 if(ben(ar,s,t)) { 18 System.out.println(tostring(ar,strlist)); 19 k++; 20 if(k==5) { 21 return; 22 } 23 } 24 } 25 } 26 static boolean ben(int ar[],int star,int end) { 27 int s=1,e=(end-star)+1; 28 for(int i=0;i<ar.length-1;i++) { 29 if((ar[i]>ar[i+1])||(ar[i]==ar[i+1])||(ar[i]<s||ar[i]>e)) { 30 return false; 31 } 32 } 33 return true; 34 } 35 static void f(int ar[],int star,int end) { 36 int e=(end-star)+1;//该句的原来代码出现错误 37 for(int i=0;i<ar.length;i++) { 38 if(ar[i]>e) { 39 ar[i]=1; 40 ar[i-1]=ar[i-1]+1; 41 } 42 } 43 } 44 static int[] tonumbers(String str,String strlist) { 45 int[] art=new int[str.length()]; 46 for(int i=0;i<art.length;i++) { 47 art[i]=strlist.indexOf(str.charAt(i))+1; 48 } 49 return art; 50 } 51 static String tostring(int ar[],String strlist) { 52 String str=""; 53 for(int i=0;i<ar.length;i++) { 54 str+=(strlist.charAt((ar[i]-1))); 55 } 56 return str; 57 } 58 }
f下的:int e=end-1;
当测试数据为
5 20 8
fhijmpqt
时候,t所代表的数为strlist里的位置i+1;即tonumber()后,该字符串变为数组ar[2,4,5,6,9,12,13,16];
ar[w-1]++之后,ar[7]变成了17;但是如果按照原来的进位限制条件为ar[i]>end-1才进位,ar[7]=17确实没有超过这个条件;因此以至于到了ben方法产生错误,直接对进位处理后的
ar[2,4,5,6,9,12,14,17]判断为符合jam,然后输出,但是无奈于tostring方法中的传入的strlist中都没有第17位,所以产生了错误;
[不过现在看来,ben方法的条件也是有点问题]
但是不管怎么说,还是解决了这个问题!!!