算法笔记_207:第五届蓝桥杯软件类决赛部分真题(Java语言C组)

目录

1 数字拆分

2 稍大的串

 

  前言:以下代码仅供参考,若有错误欢迎指正哦~


1 数字拆分

 正整数可以表示为若干正整数的累加和。

  如,对于正整数n=6,可以分划为: 
6
5+1
4+2
4+1+1
3+3
3+2+1
3+1+1+1
2+2+2
2+2+1+1
2+1+1+1+1
1+1+1+1+1+1

  现在的问题是,对于给定的正整数n,计算出所有划分情况。
  下面的代码实现了这个功能。仔细分析,填写划线部分缺失的代码。

public class MyTest
{    public static List fen(int n, int limit)
    {
        Vector v = new Vector();
        if(n<=limit) v.add(n);
        
        for(int i=1; i<n; i++)
        {
            if(n-i > limit) continue;

            List t = fen(i,n-i);
            
            for(int k=0; k<t.size(); k++)
                __________________________;  //填空位置
        }
        
        return v;
    }
    
    public static void main(String[] args)
    {        
        List v = fen(6,6);        
        for(int i=0; i<v.size(); i++)
            System.out.println(v.get(i));
    }
}



注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。

 

答案: v.add((n-i)+"+"+t.get(k))

 

 

 

 


2 稍大的串

串可以按照字典序进行比较。例如:
  abcd 小于 abdc

  如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些。科学地说:它是大于已知串的所有串中最小的串。你的任务就是求出这个“稍大的串”。

例如:
输入串:
abfxy
程序应该输出:
abfyx

再例如:
输入串:
ayyyxxff
程序应该输出:
fafxxyyy

fyyyxxaa
数据规模约定:
  输入的串不超过1000个字符。

特例:
  如果已知的串已经是所有重组串中最大的,则原样输出读入的那个串。


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

 

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 public class Main {
 5     
 6     public void getResult(String A) {
 7         int len = A.length();
 8         int i = len - 1;
 9         for(;i >= 1;i--)
10             if(A.charAt(i - 1) < A.charAt(i))
11                 break;
12         if(i == 0) {
13             System.out.println(A);
14             return;
15         }
16         char temp = A.charAt(i - 1);
17         char[] arrayB = A.substring(i).toCharArray();
18         Arrays.sort(arrayB);
19         for(int j = 0;j < arrayB.length;j++)
20             if(arrayB[j] > temp) {
21                 char a = arrayB[j];
22                 arrayB[j] = temp;
23                 temp = a;
24                 break;
25             }
26         StringBuilder result = new StringBuilder(A.subSequence(0, i - 1));
27         result.append(temp);
28         for(int j = 0;j < arrayB.length;j++)
29             result.append(arrayB[j]);
30         System.out.println(result);
31     }
32     
33     public static void main(String[] args) {
34         Main test = new Main();
35         Scanner in = new Scanner(System.in);
36         String A = in.next();
37         test.getResult(A);
38     }
39 }

 

posted @ 2017-05-16 16:59  舞动的心  阅读(788)  评论(0编辑  收藏  举报