leetcode 38 Count and Say
描述:
规则有点奇怪,第n个数 数出上个数的位。
如3122,表示上个数有3个1,2个2,即11122。
现定义:
1为1
2为11,表示1个1
3为21,表示2个1
4为1211,表示1个2,1个1
解决:
注意其中出现的push_back和move!
原本用+号和赋值,效率真的慢,为8ms左右。
+号改为push_back,只操作一个字符,尾部插入,快。
但注意,count必定不大于9,因为如果存在连续的某个数如111111,中间一段表示1个1,1个1,可以合并,所以不存在超过3个连续的。
=改为move,其实此处并未有太大效率提升,由于string构造损耗不大。move发挥作用的地方在于移动构造等构造析构代价大的地方。具体参看详细的move作用,C++11特性。
string countAndSay(int n) { if (n == 1) return ("1"); if (n == 2) return ("11"); string ret = "11"; for (int i = 3; i <= n; i++) { string pr = ""; int count = 1; char now; char last = ret[0]; for (int j = 1; j < ret.size(); j++) { now = ret[j]; if (now == last) count++; else { pr.push_back(count + '0'); pr.push_back(last); count = 1; } last = now; } pr.push_back(count + '0'); pr.push_back(last); ret = pr; ret = move(pr); // 移动函数 } return ret; }
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】