题目:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
我的答案:
版本一:

string convert(string s, int numRows)
{if (numRows == 1)return s;int L = s.length();const char *p = s.c_str();vector<vector<char> > A;vector<char> a;int N = 0;while (N < L){if (N > L)break;for (int i = 0; i < numRows; i++){if (N < L){a.push_back(*(p + N));N++;}elsebreak;}A.push_back(a);a.clear();for (int i = numRows - 2; i > 0; i--){if (N < L){for (int j = 0; j < numRows; j++){if (N < L){if (j != i)a.push_back('\0');else{a.push_back(*(p + N));N++;}}elsebreak;}A.push_back(a);a.clear();}elsebreak;}}//对最后一列的数据进行完善,因为字符串长度是随机的,所以最后一列可能在没有装满之前,字符串已经被分配完毕,所以采用这种方式补全,以进行下面每行的链接int last_size = A[A.size() - 1].size();if (last_size != numRows){for (int i = 0; i < numRows - last_size; i++)A[A.size() - 1].push_back('\0');}//数据已经存好for (int i = 0; i < A.size(); i++){for (int j = 0; j < A[i].size(); j++)cout << A[i][j] << " ";cout << endl;}stringstream ss;for (int i = 0; i < numRows; i++){for (int j = 0; j < A.size(); j++){if (A[j][i] == '\0')continue;elsess << A[j][i];}}return ss.str();
}

思路解析:遍历整个字符串,将其按照之字形的结构,按列存储,显然除了部分列的元素个数是numRows之外,其他列的元素个数都是1,为了后续字符重新排序的方便,将每列不含有字符串字符的地方用结束符代替,使得每列数据在存储中占用相同的空间,在后续数据重新排序的时候,只需要循环遍历所有的列并依次输出各列的元素(遇到结束符的时候,不输出该字符),在利用该方法的时候关键是保证一开始在遍历存储字符串的时候要保证每列都占用相同的空间,并且所有列中的非结束符字符的存放结构满足之字形结构。所以如果最后在遍历字符串结束后,要判断最后一列的元素是否为numRows个,如不是需要利用结束符补全。整个算法的思想就是不用费力去观察之字形结构的规律并建模,只需要按列存储之后并循环遍历输出即可,比较好理解,但是运行时间较长。
版本二(进阶版):

string zigzag_convert(string s, int numRows)
{if (numRows == 1)return s;if (numRows < 1)return "";int gap = 2 * numRows - 2;int val = 0;int L = s.length();string res = "";for (int i = 0; i < numRows; i++,val += 2){res += s[i];for (int j = i; j<L;){if ((gap - val) != 0){j += (gap - val);if (j < L)res += s[j];elsebreak;}if (val != 0){j += val;if (j < L)res += s[j];elsebreak;}}}return res;
}

思路解析:该版本的思想是观察之字形结构并进行建模。举例说明:
假设输入字符串为S,
S=”abcdefghijklmnopqrstuvwxyz”;
numRows=5;
以下是之字形中每行元素在字符串中的下标(为了方便表述,从数据存储的角度出发,引入第0行):
第0行:0 8 16 24
第1行:1 7 9 15 17 23 25
第2行:2 6 10 14 18 22
第3行:3 5 11 13 19 21
第4行:4 12 20
观察以上下标,可以得到结论,除了第0行与最后一行,每相隔的两个下标之间的距离都是:gap=2*numRows-2,每行的第一个元素的下标都与行号相同;第0行与最后一行的各元素相邻下标的距离为gap;根据这个规律写出以上代码。显然,利用这种方法不会消耗多余的空间,而且只需要遍历一次字符串即可,算法高效。

leetcode_zigzag conversion相关推荐

  1. Conversion error:Jekyll::Converters::Scss encountered an error while converting css/main.scss

    错误描述:Conversion error: Jekyll::Converters::Scss encountered an error while converting 'css/main.scss ...

  2. 【C】printf warning: unknown conversion type character ‘l‘ in format [-Wformat=]

    1.问题描述 在使用printf.fprintf打印long long类型时报错 printf warning: unknown conversion type character 'l' in fo ...

  3. c# 读hex_c#十六进制到位转换(c# hex to bit conversion)

    c#十六进制到位转换(c# hex to bit conversion) 我试图将64位数字的十六进制表示(例如字符串"FFFFFFFFF" )转换为二进制表示( "11 ...

  4. java建一个conversion,Scala中的JavaConverters和JavaConversions有什么区别?

    What is the difference between these two objects? Why do they both exist? When do I want to use one ...

  5. SAP MM MB21创建预留单据报错- Error during conversion to alternative units of measure -

    SAP MM MB21创建预留单据报错- Error during conversion to alternative units of measure - 某日下午收到业务部门报错,说是创建预留单保 ...

  6. php输出报错Message: Array to string conversion

    错误: Message: Array to string conversion 原因: print/echo 不能输出数组 转载于:https://www.cnblogs.com/maoriaty/p ...

  7. The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

    刚刚有在程序中,传递一个空值至MS SQL Server数据库,这个值的数据类型为DATETIME 执行时,它却发生了如标题提示的异常: The conversion of a varchar dat ...

  8. ZigZag Conversion

    ZigZag Conversion 1. Question 给定行数,将某字符串转换为zigzag形式,然后按行输出.zigzag形式如: The string "PAYPALISHIRIN ...

  9. 2014年百度之星资格赛第一题Energy Conversion

    2014年百度之星资格赛第一题Energy Conversion Problem Description 魔法师百小度也有遇到难题的时候-- 如今,百小度正在一个古老的石门面前,石门上有一段古老的魔法 ...

最新文章

  1. 【Python游戏】推箱子—老少皆宜的益智游戏,看你能过几关?
  2. mysql proxy性能差_两种MySQL-Proxy架构的测试对比记录
  3. 【NLP】Doc2vec原理解析及代码实践
  4. Django框架(20.Django的视图函数的request参数以及QueryDict对象)
  5. 自行车也能做智能升级?AliOS以想象力为智慧出行带来新体验
  6. 希尔排序 最坏时间_算法篇----希尔排序
  7. 算法入门经典-第七章 例题7-2 八皇后问题
  8. 归并算法Java实现
  9. 安装 emoji 字体
  10. 产品周报第26期|富文本编辑器新增预览功能;博客首页增加上次阅读频道记录……
  11. 服务器appcrash的问题怎么修复,Win7系统出现APPCRASH错误的修复方法
  12. DL2 - Improving Deep Neural Networks- Hyperparameter tuning, Regularization and Optimization
  13. 绝地求生服务器延迟检测源码,绝地求生不停网络延迟检测怎么办 绝地求生网络问题解决办法...
  14. win10安装graph_tool,在jupyter notebook运行代码
  15. python打开json文件_python怎么读json文件
  16. 利用python脚本批量自动下载Sentinel-1(哨兵1号)数据
  17. java考试真题6_JAVA认证考试历年真题:SCJP认证试题解析6
  18. vue接口多个参数多个组件互动导致数据渲染混乱bug
  19. Golang 等比例调整图片分辨率且用黑色补齐多余部分
  20. R语言条件逻辑回归-因变量是配对资料

热门文章

  1. 2018.3,GC可控了
  2. MaxScript 学习笔记【有转载】
  3. LINQ 查询表达式(C# 编程指南)
  4. MaBatis(5)输入/输出映射
  5. QA seven's blog
  6. Web认证及API的 使用TOKEN的一些思考
  7. 我们再来玩游戏(博弈)
  8. nyoj985带通配符的数
  9. 《Head First Python》第五章--理解数据
  10. Pytho正则表达式-match