原题:
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
is read off as "one 1"
or 11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1"
Example 2:
Input: 4 Output: "1211"
审题很麻烦,不好理解。意思是第n个字符串是读第n-1个字符串得到的。比如第四个字符串是读第三个字符串"21"得到的"1211"(一个2一个1).
思考过程:
这一过程少不了递归。
解题思路:
每个函数获取它上一个函数返回的字符串,对其进行“读”的操作。这里我是遍历整个字符串,如果现在的字符在哈希表里没有,说明它前面的重复字符串已经结束了,那么把前面字符串读取结果存储,把现在的字符存入,value为1。如果现在的字符在哈希表里有,那就将value加一,以此类推。(用哈希表有点多余,但我觉得这样适合我)。
这里最关键的是对字符两段进行处理,遍历第一个字符时直接存入,遍历玩最后一个还要对最后一段进行善后处理。
结果代码:
public String countAndSay(int n) { if (n == 1) return "1"; String num = countAndSay(n-1);//进行递归 String res = new String(); Map<Character,Character> hasMap = new HashMap<>(); hasMap.put(num.charAt(0),'1'); for (int i = 1;i <= num.length();i++){ if ((i == num.length()) || (!hasMap.containsKey(num.charAt(i)))){//i == num.length()时对前面进行处理 res += hasMap.get(num.charAt(i - 1)); res += num.charAt(i - 1); hasMap.clear(); if (i != num.length())hasMap.put(num.charAt(i),'1');//防止越界,然后存入哈希表新元素 } else hasMap.put(num.charAt(i),(char) (hasMap.get(num.charAt(i)) + 1)); } return res; }