zoukankan      html  css  js  c++  java
  • 【tongtong特殊计数法】

    特殊计数法

    时间限制: 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方法的条件也是有点问题]

    但是不管怎么说,还是解决了这个问题!!!

  • 相关阅读:
    Oracle的启动过程共经历四个阶段:
    Oracle数据库启动原理
    Oracle LISTENER监听文件参数详解及Lsnrctl命令综述
    Oracle TNS简述
    linux 各级目录的作用
    oracle 监听器的工作原理
    插入标识列
    sql server日期格式转换方法大全
    html获取输入的值的问题
    关闭窗口 不弹出提示
  • 原文地址:https://www.cnblogs.com/RorinL/p/12605330.html
Copyright © 2011-2022 走看看