博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】报数
阅读量:2056 次
发布时间:2019-04-28

本文共 2325 字,大约阅读时间需要 7 分钟。

报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

1.     12.     113.     214.     12115.     111221

1 被读作  "one 1"  ("一个一") , 即 11

11 被读作 "two 1s" ("两个一"), 即 21
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211

给定一个正整数 n ,输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

示例 1:

输入: 1输出: "1"

示例 2:

输入: 4输出: "1211"
public class CountAndSay {    public static void main(String[] args) {        System.out.println("*****请输入第n个人报数*****");        Scanner scanner = new Scanner(System.in);        int n = scanner.nextInt();        String result = countAndSay2(n);        System.out.println(result);    }    /**     * 嵌套for循环     * @param n     * @return     */    public static String countAndSay1(int n) {        String start = "1";        char[] chars = String.valueOf(n).toCharArray();        StringBuffer temp = new StringBuffer();        //外层循环:控制进行的次数        for (int i = 1; i < n; i++) {            //清空temp            temp.setLength(0);            int count = 1;            int j = 0;            //内层循环:存储每次输入的值            for (;j < start.length() - 1; j++) {                //相同则统计个数,不同则先输出再重新统计                if (start.charAt(j) == start.charAt(j + 1)){                    count++;                }else{                    temp.append(count).append(start.charAt(j));                    count = 1;                }            }            //只有上述循环执行完才能到达这步,但还需设置j > 0,因为当start="1"时,即第一次不会进入内层循环            //如果是最后一个数,则与前面的数进行比较,如果相同,count加一,否则就为1个数            if (j > 0 && (start.charAt(j) == start.charAt(j - 1))){                temp.append(count).append(start.charAt(j));            }else{                temp.append(1).append(start.charAt(j));            }            start = temp.toString();        }        return start;    }    /**     * 方法二: 进行递归     * @param n     * @return     */    public static String countAndSay2(int n){        if (n == 1){            return "1";        }        StringBuffer sb = new StringBuffer();        //递归        String forward = countAndSay2(n - 1);        int index = 0;        while (index < forward.length()){            int curr = index;            while (curr < forward.length() && forward.charAt(index) ==  forward.charAt(curr)){                curr++;            }            sb.append(curr - index).append(forward.charAt(index));            index = curr;        }        return sb.toString();    }}

 

 

 

转载地址:http://qvslf.baihongyu.com/

你可能感兴趣的文章
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>
数据结构 拓扑排序
查看>>
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>
(1129) Recommendation System 排序
查看>>
PAT1090 Highest Price in Supply Chain 树DFS
查看>>
(PAT 1096) Consecutive Factors (质因子分解)
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【UML】《Theach yourself uml in 24hours》——hour2&hour3
查看>>
【linux】nohup和&的作用
查看>>
【UML】《Theach yourself uml in 24hours》——hour4
查看>>