原题叫countAndSay,描述不太好理解。大致意思是点查每前一个串里的1,2,3的数量,最开始1号序列是1,然后2号就是1个1,即“11”,如下描述:
有对应序列,输入序号求相应的串:
当n = 1,串为1,;
当n = 2,串为1个1(n=1时),即“11”
当n = 3,串为2个1(n=2时),即“21”
当n = 4,串为1个2加1个1,即“1211”
以此类推,求第n个的对应串,countAndSay(int n);
题目属于简单类,除了题目描述,思路比较好理解,主要有些边界条件需要考虑到,基于第n个的对应串依靠前一个n-1的结果,有使用递归,但性能影响不是很大。思路是采用一个map存三种字符(1,2,3)的出现次数,先递归求n-1的序列,得到s,遍历s,统计对应字符出现的次数,如果连续,进入while
,次数累加,否则跳到s序列下一个字符,另外每次完成循环清空统计map
,完成一次统计后按照[次数,字符]的格式追加到结果序列的StringBuilder
里。
public static void main(String[] args) {
System.out.println(countAndSay(16));
}
public static String countAndSay(int n) {
if (n <= 1) {
return "1";
}
Map<Character, Integer> s123 = new HashMap<>();
String s = countAndSay(n - 1);
StringBuilder newS = new StringBuilder();
for (int i = 0; i < s.length(); ) {
s123.clear();
Character c = s.charAt(i);
s123.put(c, 1);
i++;
while (i < s.length()) {
if (s.charAt(i) == c) {
s123.put(c, s123.get(c) + 1);
i++;
} else {
break;
}
}
if (s123.get(c) != null) {
newS.append(s123.get(c)).append(c);
}
}
return newS.toString();
}
网友评论