A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© OCTSJimmy 中级黑马   /  2014-11-9 11:12  /  1615 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 OCTSJimmy 于 2014-11-9 11:17 编辑

问题是这样子的,
程序执行后假如都输入数字30,会——输出一堆的空格,但是,将这些字符串复制出来,粘贴在记事本中,会发现又正常了,这是?……
感觉好神奇好高端有木有?……
代码如下:
注释是一样的,又长,就不多帖了。


  1. <P>/*
  2. * “伯爵说”序列如下:1, 11, 21, 1211, 111221, ...
  3. * 1 读作 "一(个)1" 由此可写成 11
  4. * 11 读作 "二(个)1" 由此可写成 21
  5. * 21 读作 "一(个)2, 一(个)1" 或者 1211.
  6. *
  7. * The count-and-say sequence is the sequence of integers beginning as follows:
  8. * 1, 11, 21, 1211, 111221, ...
  9. *
  10. * 1 is read off as "one 1" or 11.
  11. * 11 is read off as "two 1s" or 21.
  12. * 21 is read off as "one 2, then one 1" or 1211.
  13. *
  14. * Given an integer n, generate the nth sequence.
  15. * Note: The sequence of integers will be represented as a string.</P>
  16. <P> *
  17. * 格式:给定一个整数n,输出第n个序列。
  18. * 注意:整数序列以字符串的形式表示。
  19. * PS:相信你已经看懂了题目,如果没看懂,小提示下,
  20. * 其实类似于求”菲波拉契“数列的第n项哦~
  21. * 样例输入
  22. * 6
  23. * 样例输出
  24. * 312211
  25. */</P>
复制代码
代码递归版本的:
  1. import java.util.Scanner;

  2. public class Main2 {
  3. private static StringBuilder[] arrString = new StringBuilder[100];
  4. private static Scanner sc = new Scanner(System.in);
  5. private static int getInput(){
  6. int num = sc.nextInt();
  7. return num;
  8. }

  9. public static void main(String[] args) {
  10. // TODO 自动生成的方法存根
  11. String str = getResult(getInput());
  12. str = str.substring(0, str.length()-1);
  13. System.out.println(str);
  14. }
  15. private static String getResult(int in){
  16. for(int i=0;i<100;i++){
  17. arrString[i] = new StringBuilder();
  18. }
  19. return coreDo(in).toString();
  20. }
  21. private static StringBuilder coreDo(int in){
  22. StringBuilder str = new StringBuilder();
  23. if(in < 2){
  24. return new StringBuilder().append("1 ");
  25. }
  26. if(in<3){
  27. return new StringBuilder().append("11 ");
  28. }
  29. if(in < 100){
  30. if(arrString[in].length() > 0){
  31. return arrString[in];
  32. } else {
  33. str = coreDo(in -1);
  34. arrString[in] = str;
  35. }
  36. } else {
  37. str = coreDo(in -1);
  38. }
  39. StringBuilder result = new StringBuilder();
  40. boolean sign = false;
  41. char ch1 = 0, ch2 = 0;
  42. for(int i=0;i<str.length();i++){
  43. ch1 = str.charAt(i);
  44. for(int j=i;j<str.length();j++){
  45. ch2 = str.charAt(j);
  46. if(i == j){
  47. continue;
  48. }
  49. if(ch2==ch1){
  50. if(sign){
  51. result.append("3");
  52. result.append(str.charAt(j));
  53. i = j;
  54. sign = false;
  55. break;
  56. } else {
  57. sign = true;
  58. }
  59. } else {
  60. if(sign){
  61. result.append("2");
  62. result.append(str.charAt(j-1));
  63. i = j - 1;
  64. sign = false;
  65. break;
  66. } else {
  67. i = j - 1;
  68. result.append("1");
  69. result.append(str.charAt(j-1));
  70. break;
  71. }
  72. }
  73. }
  74. }
  75. return result.append(" ");
  76. }

  77. }
复制代码
非递归版本的:
  1. import java.util.Scanner;

  2. public class Main {
  3. private static StringBuilder[] arrString = new StringBuilder[100];
  4. private static Scanner sc = new Scanner(System.in);
  5. private static int getInput(){
  6. int num = sc.nextInt();
  7. return num;
  8. }

  9. public static void main(String[] args) {
  10. // TODO 自动生成的方法存根
  11. String str = getResult(getInput());
  12. str = str.substring(0, str.length()-1);
  13. System.out.println(str);
  14. }
  15. private static String getResult(int in){
  16. for(int i=0;i<100;i++){
  17. arrString[i] = new StringBuilder();
  18. }
  19. StringBuilder sb = new StringBuilder();
  20. for(int i=0;i<=in;i++){
  21. sb = coreDo(i, sb);
  22. }
  23. return sb.toString();
  24. }
  25. private static StringBuilder coreDo(int in, StringBuilder preSb){
  26. StringBuilder str = new StringBuilder();

  27. if(in < 2){
  28. return new StringBuilder().append("1 ");
  29. }
  30. if(in<3){
  31. return new StringBuilder().append("11 ");
  32. }
  33. if(in < 100){
  34. if(arrString[in].length() > 0){
  35. return arrString[in];
  36. } else {
  37. str = preSb;
  38. arrString[in] = str;
  39. }
  40. } else {
  41. str = preSb;
  42. }
  43. StringBuilder result = new StringBuilder();
  44. boolean sign = false;
  45. char ch1 = 0, ch2 = 0;
  46. for(int i=0;i<str.length();i++){
  47. ch1 = str.charAt(i);
  48. for(int j=i;j<str.length();j++){
  49. ch2 = str.charAt(j);
  50. if(i == j){
  51. continue;
  52. }
  53. if(ch2==ch1){
  54. if(sign){
  55. result.append("3");
  56. result.append(str.charAt(j));
  57. i = j;
  58. sign = false;
  59. break;
  60. } else {
  61. sign = true;
  62. }
  63. } else {
  64. if(sign){
  65. result.append("2");
  66. result.append(str.charAt(j-1));
  67. i = j - 1;
  68. sign = false;
  69. break;
  70. } else {
  71. i = j - 1;
  72. result.append("1");
  73. result.append(str.charAt(j-1));
  74. break;
  75. }
  76. }
  77. }
  78. }
  79. return result.append(" ");
  80. }

  81. }
复制代码

程序执行后假如都输入数字30,会——输出一堆的空格,但是,将这些字符串复制出来,粘贴在记事本中,会发现又正常了,这是?……
感觉好神奇好高端有木有?……

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

4 个回复

倒序浏览
好长的代码,没心情看完
回复 使用道具 举报
代码阅读性好差。。。
回复 使用道具 举报
昨天写IO的代码的时候也遇到了
我是把文本中的文字读出来然后输出
结果只有一行空白
我还以为出错了特点检查了好几遍
最后往记事本一贴
都是数字。
在代码里转换为char就能显示了。
不知道为什么。
回复 使用道具 举报
这代码  只有我一个人是一拉到底么
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马