龙空技术网

历届蓝桥杯大赛试题及答案汇总(5题),还有一个月,你准备好了?

动作要快姿势要帅 196

前言:

此时姐妹们对“蓝桥杯题目及答案java”大约比较看重,兄弟们都需要分析一些“蓝桥杯题目及答案java”的相关知识。那么小编同时在网摘上收集了一些对于“蓝桥杯题目及答案java””的相关资讯,希望姐妹们能喜欢,同学们快快来了解一下吧!

1.字符排序

算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种。如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况。

package Question1_9;

import java.util.Scanner;

import java.util.Vector;

public class Question1 {

public static long count=0;

private void fullPermutation(Vector<Character>sourse, Vector<Character> result) {

if(sourse.size()==0){

for (int i = 0; i < result.size(); i++) {

System.out.print(result.elementAt(i));

}

System.out.print("\n");

count++;

return;

}

for (int i = 0; i < sourse.size(); i++) {

Vector<Character>tsourse=new Vector<Character>(sourse);

Vector<Character>tresult=new Vector<Character>(result);

tresult.add(sourse.elementAt(i));

tsourse.remove(i);

new Question1().fullPermutation(tsourse, tresult);

}

}

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

int n=scanner.nextInt();

Vector<Character> sourse=new Vector<Character>();

Vector<Character> result=new Vector<Character>();

for (int i = 0; i < n; i++) {

sourse.add((char)('A'+i));

}

new Question1().fullPermutation(sourse, result);

System.out.println(Question1.count);

}

}

方法二:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.LinkedHashSet;

import java.util.List;

import java.util.Scanner;

import java.util.Set;

public class Demo03 {

// 去掉重复元素,放入lis

public static void removeDuplicate(String s,Set<Character> lis){

for(char x:s.toCharArray()){

lis.add(x);

}

}

// 为方便操作 将 sets 转 lis

public static void convert(List<Character> lis,Set<Character> sets){

Iterator<Character> iter = sets.iterator();

while(iter.hasNext()){

lis.add(iter.next());

}

}

// 检测符合条件的元素组合

public static void check(Set<Character> sets){

List<Character> lis = new ArrayList<Character>();

convert(lis,sets); // 为方便操作 将 sets 转 lis

StringBuffer sb = new StringBuffer();

for(int i=0;i<lis.size()-2;i++){

for(int j=i+1;j+1<lis.size();j++){ // 向后添加两位,所以 j+1<lis.size()

for(int k=j+1;k<lis.size();k++){

sb.append(lis.get(i));

sb.append(lis.get(j));

sb.append(lis.get(k));

System.out.println(sb); // 输出组合

sb.setLength(0); // 清空

}

}

}

}

public static void main(String[] args){

Scanner scan = new Scanner(System.in);

System.out.println("输入串(不大于30个字符)。");

String s = scan.nextLine();

Set<Character> sets = new LinkedHashSet<Character>();

removeDuplicate(s,sets); // 去掉重复元素,放入lis

check(sets); // 检测符合条件的元素组合

}

}

运行结果:

输入串(不大于30个字符)。

abcd

abc

abd

acd

bcd

2.串的简单处理

串的处理

在实际的开发工作中,对字符串的处理是最常见的编程任务。

本题目即是要求程序对用户输入的串进行处理。具体规则如下:

1.把每个单词的首字母变为大写。

2.把数字与字母之间用下划线字符(_)分开,使得更清晰

3.把单词中间有多个空格的调整为1个空格。

例如:

用户输入:

you and me what cpp2005program

则程序输出:

You And Me What Cpp_2005_program

用户输入:

this is a 99cat

则程序输出:

This Is A 99_cat

我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。

每个单词间由1个或多个空格分隔。

假设用户输入的串长度不超过200个字符。

package Question1_9;

import java.util.Scanner;

import java.util.Vector;

public class Question2 {

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

String string=scanner.nextLine();

Vector<Character>vector=new Vector<Character>();

for (int i = 0; i < string.length(); i++) {

vector.add(string.charAt(i));

}

try {

int index=0;

while (index<vector.size()) {

if(index==0&&vector.elementAt(index)>='a'&&vector.elementAt(index)<='z'){

vector.set(index, (char)(vector.elementAt(index)-('a'-'A')));

}else if(vector.elementAt(index-1)==' '&&vector.elementAt(index)==' '){

vector.remove(index);

index--;

}else if (vector.elementAt(index-1)==' '&&(vector.elementAt(index)>='a'&&vector.elementAt(index)<='z')) {

vector.set(index, (char)(vector.elementAt(index)-('a'-'A')));

}else if((vector.elementAt(index)>='a'&&vector.elementAt(index)<='z')&&(vector.elementAt(index-1)>='0'&&vector.elementAt(index-1)<='9')){

vector.add(index, '_');

index++;

}else if((vector.elementAt(index-1)>='a'&&vector.elementAt(index-1)<='z')&&(vector.elementAt(index)>='0'&&vector.elementAt(index)<='9')){

vector.add(index, '_');

index++;

}

index++;

}

for (int i = 0; i <vector.size(); i++) {

System.out.print(vector.elementAt(i));

}

System.out.println();

} catch (ArrayIndexOutOfBoundsException e) {

// TODO: handle exception

}

}

}

运行结果:

you and me what cpp2005program

You And Me What Cpp_2005_program

方法二:

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/*

* 本题目即是要求程序对用户输入的串进行处理。具体规则如下:

*1.把每个单词的首字母变为大写。

*2.把数字与字母之间用下划线字符(_)分开,使得更清晰

*3.把单词中间有多个空格的调整为1个空格。

*我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。

*假设用户输入的串长度不超过200个字符。

*/

public class SimpleString {

public static void main(String args[]){

String str="";

str=(new Scanner(System.in)).nextLine();

String []str1=str.split("[ ]+");

for(int i=0;i<str1.length;i++)str1[i]=String.valueOf((char)(str1[i].charAt(0)+('A'-'a')))+str1[i].substring(1);

String s="";

for(int i=0;i<str1.length-1;i++)//System.out.print(str1[i]+" ");

{

s+=str1[i]+" ";

}

s+=str1[str1.length-1];

Pattern p=Pattern.compile("([0-9]+)");

Matcher m=p.matcher(s);

String fin="";

int st=0;

while(m.find()){

int start=m.start();

int end=m.end();

fin+=s.substring(st,start);

if(s.charAt(start-1)!=' ')fin+="_";

fin+=m.group(1);

if(s.charAt(end)!=' ')fin+="_";

st=end;

}

if(st<s.length())fin+=s.substring(st);

System.out.println(fin);

}

}

方法三:

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Demo02 {

public static void print(String[] s){

for(int i=0;i<s.length-1;i++){

System.out.print(s[i]+" ");

}

System.out.println(s[s.length-1]);

}

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

String s = scan.nextLine();

String[] ss = s.split("[\\s]+");

for(int i=0;i<ss.length;i++){

String up = (""+ss[i].charAt(0)).toUpperCase(); // 大写

StringBuffer sb = new StringBuffer(ss[i]);

ss[i] = sb.replace(0, 1, up).toString();

Matcher m = Pattern.compile("\\d+").matcher(ss[i]);

while(m.find()){

String num = new String(m.group());

String num2 = num;

num2 = "_"+num+"_"; // 数字前添加"_"

ss[i] = ss[i].replace(num, num2);

if(ss[i].startsWith("_")){ // 去头"_"

ss[i] = ss[i].substring(1);

}

if(ss[i].endsWith("_")){ // 去尾"_"

ss[i] = ss[i].substring(0,ss[i].length()-1);

}

}

}

print(ss);

}

}

运行结果:

you and me what cpp2005program

You And Me What Cpp_2005_program

3.猜算式

看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。

该算式中1至9的每个数字出现且只出现一次!

比如:

46 x 79 = 23 x 158

54 x 69 = 27 x 138

54 x 93 = 27 x 186

.....

请编程,输出所有可能的情况!

注意:

左边的两个乘数交换算同一方案,不要重复输出!

不同方案的输出顺序不重要

package Question1_9;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import java.util.Vector;

public class Question3 {

public static long count=0;

public static List<Vector<Character>> filteredNonRedundantResults;

private static boolean isfilter(Vector<Character> result) {

int a=(result.elementAt(0)-'0')*10+(result.elementAt(1)-'0');

int b=(result.elementAt(2)-'0')*10+(result.elementAt(3)-'0');

int c=(result.elementAt(4)-'0')*10+(result.elementAt(5)-'0');

int d=(result.elementAt(6)-'0')*100+(result.elementAt(7)-'0')*10+(result.elementAt(8)-'0');

if(a*b==c*d){

return true;

}

return false;

}

public static void print(Vector<Character>vector) {

System.out.printf("%c%c x %c%c = %c%c x %c%c%c",vector.elementAt(0),vector.elementAt(1),vector.elementAt(2),vector.elementAt(3),vector.elementAt(4),vector.elementAt(5),vector.elementAt(6),vector.elementAt(7),vector.elementAt(8));

}

private static void fullPermutation(Vector<Character>sourse, Vector<Character> result) {

if(sourse.size()==0&&isfilter(result)){

boolean exit=false;

for (int i = 0; i < filteredNonRedundantResults.size(); i++) {

int ra=(result.elementAt(0)-'0')*10+(result.elementAt(1)-'0');

int rb=(result.elementAt(2)-'0')*10+(result.elementAt(3)-'0');

int fa=(filteredNonRedundantResults.get(i).elementAt(0)-'0')*10+(filteredNonRedundantResults.get(i).elementAt(1)-'0');

int fb=(filteredNonRedundantResults.get(i).elementAt(2)-'0')*10+(filteredNonRedundantResults.get(i).elementAt(3)-'0');

if(ra==fb&&rb==fa){

exit=true;

break;

}

}

if(exit==false){

filteredNonRedundantResults.add(new Vector<Character>(result));

}

return;

}

for (int i = 0; i < sourse.size(); i++) {

result.add(sourse.elementAt(i));

sourse.remove(i);

fullPermutation(sourse, result);

sourse.add(i, result.elementAt(result.size()-1));

result.remove(result.size()-1);

}

}

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

int n=9;

Vector<Character> sourse=new Vector<Character>();

Vector<Character> result=new Vector<Character>();

for (int i = 1; i <= n; i++) {

sourse.add((char)('0'+i));

}

Question3.filteredNonRedundantResults=new ArrayList<Vector<Character>>();

Question3.fullPermutation(sourse, result);

for (int i = 0; i < Question3.filteredNonRedundantResults.size(); i++) {

Question3.print(Question3.filteredNonRedundantResults.get(i));

System.out.println();

}

}

}

运行结果:

46 x 79 = 23 x 158

54 x 69 = 27 x 138

54 x 93 = 27 x 186

58 x 67 = 29 x 134

58 x 69 = 23 x 174

58 x 73 = 29 x 146

58 x 96 = 32 x 174

63 x 74 = 18 x 259

64 x 79 = 32 x 158

73 x 96 = 12 x 584

76 x 98 = 14 x 532

方法二:

import java.util.List;

import java.util.ArrayList;

public class Demo01 {

static List<String> lis = new ArrayList<String>(); // 结果1(有重复的结果)

static List<String> lis2 = new ArrayList<String>(); // 结果2(去重复后的结果)

// 初始化数组为1~9

public static void init(int[] n) {

for(int i=0;i<9;i++){

n[i] = i+1; // 初始化数组为1~9

}

}

// 是否重复

public static boolean isDup(String s1,String s2){

String a1 = s1.substring(0,2);

String a2 = s1.substring(2,4);

String b1 = s2.substring(0,2);

String b2 = s2.substring(2,4);

if(a1.equals(b2)&&a2.equals(b1)){

return true;

}else{

return false;

}

}

// 去除lis重复元素

public static void removeDuplicate(){

lis2.add(lis.get(0));

for(int i=1;i<lis.size();i++){

boolean flag = true; // 标记是否重复

for(int j=0;j<lis2.size();j++){

flag = isDup(lis.get(i),lis2.get(j)); // 判断是否重复

if(flag) break; // 如果元素重复,直接跳出这层循环,测试下个数据

}

if(!flag){

lis2.add(lis.get(i)); // 不重复,则添加

}

}

}

// 输出

public static void print(){

for(String s:lis2){

String a = s.substring(0,2);

String b = s.substring(2,4);

String c = s.substring(4,6);

String d = s.substring(6);

System.out.println(a+" x "+b+" = "+c+" x "+d);

}

}

// 检测结果,符合条件的输出

public static void check(int[] n){

StringBuffer sb = new StringBuffer();

for(int x:n){ // 数字数组转为字符串

sb.append(x);

}

int a = Integer.parseInt(sb.substring(0,2).toString());

int b = Integer.parseInt(sb.substring(2,4).toString());

int c = Integer.parseInt(sb.substring(4,6).toString());

int d = Integer.parseInt(sb.substring(6).toString());

if(a*b==c*d){

lis.add(sb.toString()); // 添加结果

}

}

// 全排列进行测试

public static void allSort(int[] n,int start,int end){

if(start>=end){

check(n); // 检测结果,符合条件的输出

return ;

}else{

for(int i=start;i<=end;i++){

int t = n[start]; // 交换元素

n[start] = n[i];

n[i] = t;

// 递归全排列

allSort(n,start+1,end);

t = n[start]; // 还原元素

n[start] = n[i];

n[i] = t;

}

}

}

public static void fun(){

int[] n = new int[9];

init(n); // 初始化数组为1~9

allSort(n,0,n.length-1); // 全排列测试

removeDuplicate(); // 去除重复元素

}

public static void main(String[] args){

fun(); //

print(); // 输出结果

}

}

运行结果:

46 x 79 = 23 x 158

54 x 69 = 27 x 138

54 x 93 = 27 x 186

58 x 67 = 29 x 134

58 x 69 = 23 x 174

58 x 73 = 29 x 146

58 x 96 = 32 x 174

63 x 74 = 18 x 259

64 x 79 = 32 x 158

73 x 96 = 12 x 584

76 x 98 = 14 x 532

4.Excel地址转换

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:"D12",第5行第255列表示为"IU5"。

事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。

第12行第4列表示为:"R12C4",第5行第255列表示为"R5C255"。

你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。

【输入、输出格式要求】

用户先输入一个整数n(n<100),表示接下来有n行输入数据。

接着输入的n行数据是RC格式的Excel单元格地址表示法。

程序则输出n行数据,每行是转换后的常规地址表示法。

例如:用户输入:

2

R12C4

R5C255

则程序应该输出:

D12

IU5

package Question1_9;

import java.util.Scanner;

import java.util.Stack;

import java.util.Vector;

public class Question4 {

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

int n=scanner.nextInt();

scanner.nextLine(); //必须加上的,不然会导致输入不准确!

while (n>0) {

String string=scanner.nextLine();

String strings[]=string.split("C");

strings[0]=strings[0].substring(1, strings[0].length());

int hangshu=Integer.parseInt(strings[0]),lieshu=Integer.parseInt(strings[1]);//获取行数和列数

/*

* 对列数进行变换

*/

Stack<Character>stack=new Stack<Character>();

while(lieshu>0){

if(lieshu%26==0){

stack.push('Z');

lieshu=lieshu/26-1;

}else {

stack.push((char)('A'-1+lieshu%26));

lieshu=lieshu/26;

}

}

while (!stack.empty()) {

System.out.print(stack.pop());

}

System.out.println(hangshu);

n--;

}

}

}

运行结果:

输入一个整数n(n<100)

2

R12C4

R5C255

D12

IU5

方法二:

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Demo03 {

// 计算出字母的个数

public static int checkCount(int n){

int count = 1;

while(true){

int t = (int)Math.pow(26, count);

if(n > t){

count++;

n -= t;

}else{

return count;

}

}

}

// 添加余数对应的字母

public static char f(int n){

if(n==26){

return 'Z';

}else{

return (char)('A'-1+n%26);

}

}

// 计算结果

public static String fun(int Row,int Col){

StringBuffer sb = new StringBuffer();

int count = checkCount(Col); // 计算出字母的个数

while(count>0){

if(Col%26==0){ //如果能除尽

// 例(702):702/26时(2余0) 应该分配成(1,26)

// 个位 加26('Z')时 就等于 十位上的2 去掉(1个26),(一个(个位的26)对应一个(十位的1))

// 修改n的值 2-1; n就等于1; 这时就分配成了(1,26);

sb.insert(0,'Z'); // 添加'Z'

Col = Col/26 -1;

}else{

sb.insert(0,f(Col));// 添加余数r对应的字母

Col /= 26; // 修改 n 的值

}

count--;

}

sb.append(Row); // RC地址后添加(行号)

return sb.toString();

}

// 输入数据

public static void input(String[] s){

Scanner scan = new Scanner(System.in);

int i = 0;

while(i<s.length){ // 输入n个数据

s[i++] = scan.nextLine();

}

}

// 拆分并计算结果

public static void splitOper(String[] s){

Pattern p = Pattern.compile("[0-9]+"); // 以数字做分隔

for(int i=0;i<s.length;i++){

Matcher m = p.matcher(s[i]); // 得到所有数字

m.find(); // 得到第一个数字

int Row = Integer.parseInt(m.group()); // 取出第一个数字

m.find(); // 得到第二个数字

int Col = Integer.parseInt(m.group()); // 取出第二个数字

System.out.println(fun(Row,Col)); // 计算结果并输出

}

}

// 主函数

public static void main(String[] args){

Scanner scan = new Scanner(System.in);

System.out.println("输入一个整数n(n<100)");

String[] s = new String[scan.nextInt()];

input(s); // 输入数据

splitOper(s); // 拆分并计算结果

}

}

运行结果:

输入一个整数n(n<100)

2

R12C4

R5C255

D12

IU5

5.手机尾号评分

30年的改革开放,给中国带来了翻天覆地的变化。2011全年中国手机产量约为11.72亿部。手机已经成为百姓的基本日用品!给手机选个好听又好记的号码可能是许多人的心愿。

但号源有限,只能辅以有偿选号的方法了。

这个程序的目的就是:根据给定的手机尾号(4位),按照一定的规则来打分。其规则如下:

1. 如果出现连号,不管升序还是降序,都加5分。例如:5678,4321都满足加分标准。

2. 前三个数字相同,或后三个数字相同,都加3分。例如:4888,6665,7777都满足加分的标准。

注意:7777因为满足这条标准两次,所以这条规则给它加了6分。

3. 符合AABB或者ABAB模式的加1分。例如:2255,3939,7777都符合这个模式,所以都被加分。

注意:7777因为满足这条标准两次,所以这条标准给它加了2分。

4. 含有:6,8,9中任何一个数字,每出现一次加1分。例如4326,6875,9918都符合加分标准。其中,6875被加2分;9918被加3分。

尾号最终得分就是每条标准的加分总和!

要求程序从标准输入接收数据,在标准输出上输出结果。

输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行4位一组的数据,就是等待计算加分的手机尾号。

例如,输入:

14

3045

….

…..

6789

8866

则输出:

0

0

….

8

5

*/

package Question1_9;

import java.util.Scanner;

import java.util.Stack;

import java.util.Vector;

public class Question5 {

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

int n=scanner.nextInt();

scanner.nextLine();

while ((n--)>0) {

String telphone=scanner.nextLine();

int sum=0;

/*

* 情况一

*/

if(telphone.charAt(0)-telphone.charAt(1)==1){

char ch=telphone.charAt(0);

int index=0;

while (index<4&&ch==telphone.charAt(index)) {

ch--;

index++;

}

if(index>=4){

sum+=5;

}

}

if (telphone.charAt(0)-telphone.charAt(1)==-1) {

char ch=telphone.charAt(0);

int index=0;

while (index<4&&ch==telphone.charAt(index)) {

ch++;

index++;

}

if(index>=4){

sum+=5;

}

}

/*

* 情况二

*/

if (telphone.charAt(0)==telphone.charAt(1)&&telphone.charAt(1)==telphone.charAt(2)) {

sum+=3;

}

if(telphone.charAt(1)==telphone.charAt(2)&&telphone.charAt(2)==telphone.charAt(3)){

sum+=3;

}

/*

* 情况三

*/

if(telphone.charAt(0)==telphone.charAt(1)&&telphone.charAt(2)==telphone.charAt(3)){

sum+=1;

}

if(telphone.charAt(0)==telphone.charAt(2)&&telphone.charAt(1)==telphone.charAt(3)){

sum+=1;

}

/*

* 情况四

*/

for (int i = 0; i < 4; i++) {

if(telphone.charAt(i)=='6'||telphone.charAt(i)=='8'||telphone.charAt(i)=='9'){

sum+=1;

}

}

System.out.println(sum);

}

}

}

运行结果:

14

3045

0211

…..

…..

……

8

5

方法二:

import java.util.Scanner;

public class Demo07 {

// 输入数据

public static void input(String[] n){

Scanner scan = new Scanner(System.in);

int i = 0;

while(i<n.length){

n[i++] = scan.nextLine();

}

}

// 得到分数

public static int getGrade(String n){

int s = 0; // 总分

char[] x = n.toCharArray();

int a = x[0]-'0';

int b = x[1]-'0';

int c = x[2]-'0';

int d = x[3]-'0';

if(a+1==b&&b+1==c&&c+1==d||a-1==b&&b-1==c&&c-1==d){

s += 5; // 1.出现连号 +5分

}

if(a==b&&b==c){

s += 3; // 2.三个数字相同 (前三)+3分

}

if(b==c&&c==d){

s += 3; // 2.三个数字相同 (后三)+3分

}

if(a==b&&c==d){

s += 1; // 3.AABB模式 +1分

}

if(a==c&&b==d){

s += 1; // 3.ABAB模式 +1分

}

if(a==6||a==8||a==9){

s += 1; // 4.a含有:6 或 8 或 9 +1分

}

if(b==6||b==8||b==9){

s += 1; // 4.b含有:6 或 8 或 9 +1分

}

if(c==6||c==8||c==9){

s += 1; // 4.c含有:6 或 8 或 9 +1分

}

if(d==6||d==8||d==9){

s += 1; // 4.d含有:6 或 8 或 9 +1分

}

return s;

}

// 取得每一行分数并输出

public static void fun(String[] n){

for(String x:n){

System.out.println(getGrade(x));

}

}

public static void main(String[] args){

Scanner scan = new Scanner(System.in);

String[] n = new String[scan.nextInt()];

input(n); // 输入数据

fun(n);

}

}

运行结果:

14

3045

0211

2345

6543

7777

8888

7878

7788

6688

2424

2244

9918

6789

8866

0

0

5

6

8

12

3

3

5

1

1

3

8

5

PS:留言告诉小编你是否需要蓝桥杯系列复习内容

标签: #蓝桥杯题目及答案java #蓝桥杯javac组真题解析 #蓝桥杯java例题