ACM试题: 输入四行大写英文字母组成的文字,输出一个反映每个字母出现的图表。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM试题: 输入四行大写英文字母组成的文字,输出一个反映每个字母出现的图表。相关的知识,希望对你有一定的参考价值。
Sample Input
1
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
Sample Output
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
为什么我写的程序老是报java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516
这是我的源代码:import java.io.IOException;
import java.util.Scanner;
import java.io.*;;
public class Main
static int Cn[];
static int bign;
static int zuigaol;
static int jz[][];
static int zuihou[];
static Scanner scan=new Scanner(System.in);
static Scanner scan2=new Scanner(System.in);
static String[] inp;
public static void main(String[] args) throws IOException
int N;
N=scan2.nextInt();
inp=new String[4];
for(int i=0;i<N;i++)
for(int j=0;j<4;j++)
inp[j]=scan.nextLine();
deal();
public static void deal()
Cn=new int[26];
for(int i=0;i<4;i++)
dealOne(inp[i]);
bign=getBig();
zuihou=new int [bign];
jzCS();
showResult();
public static void dealOne(String s)
char cs[]=s.toCharArray();
char temp;
for(int i=0;i<s.length();i++)
temp=cs[i];
if(temp>=65&&temp<=123)
Cn[temp-65]++;
public static int getBig()
int big=0;
for(int i=0;i<26;i++)
if(Cn[i]>=big)
big=Cn[i];
zuigaol=i;
return big;
public static void jzCS()
jz=new int[bign][26];
for(int i=0;i<26;i++)
yhCS(i);
public static void yhCS(int l)
int n=Cn[l];
if(l<zuigaol)
for(int f=bign-n;f<bign;f++)
jz[f][l]=1;
for(int f=bign-n-1;f>=0;f--)
jz[f][l]=0;
else if(l==zuigaol)
for(int f=bign-1;f>=0;f--)
jz[f][l]=1;
else
for(int f=bign-n;f<bign;f++)
jz[f][l]=1;
changeTo(f,l);
for(int f=bign-n-1;f>=0;f--)
jz[f][l]=2;
public static void changeTo(int h,int l)
for(int i=0;i<l;i++)
if(jz[h][i]==2)
jz[h][i]=0;
public static int lastOne(int h)
int l=0;
for(int i=0;i<26;i++)
if(jz[h][i]==1)
l=i;
return l;
public static void showResult()
for(int i=0;i<bign;i++)
//System.out.println(lastOne(i));
for(int j=0;j<26;j++)
if(jz[i][j]==0)
if(j==0)
System.out.print(" ");
else
System.out.print(" ");
else if(jz[i][j]==1)
if(j==0)
System.out.print("*");
else
System.out.print(" *");
else
System.out.print("");
System.out.println();
System.out.println("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
但是不用输入第一个1,而如果你输入了的话,就把后面的一行给用了 于是就后面少了一行就出错了
这个是解答:
http://www.java3z.com/cwbwebhome/article/article17/acm003.html
//int N;
// N=scan2.nextInt();
// inp=new String[4];
// for(int i=0;i<N;i++)
//
for(int j=0;j<4;j++)
inp[j]=scan.nextLine();
deal();
// 追问
解决了,第一个scanner是用的next方法,第二个用了nextLine方法,这样next读完第一行之后并没有负责换行,nextLine继续在空的第一行读取就出错了。麻烦您了
追答既然你自己解决了就好
我当时也在想你为什么不第一个也用int n = Integer.parserInt(in.nextLine());
这个异常说明你可能多运行了一次getline 结果在scanner中没有对应的数据而抛出异常追问
恩,我也是这么想的,但是在自己机子上运行每次输入都没报错,应该不是geiLine次数的问题,不知道是不是输入格式不一致
洛谷—— P1598 垂直柱状图
P1598 垂直柱状图
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入输出格式
输入格式:
四行字符,由大写字母组成,每行不超过72个字符
输出格式:
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入输出样例
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HISTOGRAM PROGRAM. HELLO!
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
说明
每行输出后面不允许出现多余的空格。
哇塞、、
#include<cstdio> #include<cstring> #include<iostream> #define N 1010 using namespace std; char ch[N]; int l,maxn,s[N]; int main() { for(int i=1;i<=4;i++) { gets(ch+1); l=strlen(ch+1); for(int i=1;i<=l;i++) s[ch[i]-‘A‘+1]++; } for(int i=1;i<=26;i++) maxn=max(maxn,s[i]); for(int i=maxn;i>=1;i--) { for(int j=1;j<=26;j++) if(s[j]<i) printf(" "); else printf("* "); printf("\n"); } for(int i=0;i<26;i++) cout<<char(i+‘A‘)<<" "; return 0; }
以上是关于ACM试题: 输入四行大写英文字母组成的文字,输出一个反映每个字母出现的图表。的主要内容,如果未能解决你的问题,请参考以下文章