本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41408021

看完这篇文章,你可能会学到到知识如下:

(1)对于给定的算法题,如何正确对其进行分析,而不是通过穷举的方式来得到答案。

(2)当解题逻辑非常清晰时,才开始编码,否则你很难编写出正确的代码。

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"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

思路:

(1)通过字符串在每一行出现的顺序,可以其分两个部分:第一行和最后一行,中间行。

(2)对于第一行和最后一行,由上图可知,具有相同的对应关系。

(3)对于中间行,前一个下标的值和后一个下标的值需要根据这个下标是该行中的奇数列还是偶数列来计算。

(4)对已第一行和最后一行,通过规律发现,其对应关系为:start + 2 * 总行数 - 2 ,其中start为该行起始字符在数组的位置。例如第一行开始的start = 0,则后续对

应位置 为0 + 2 * 5 - 2 = 8,初始start为各行的起始值。同理,对于最后一行,当start = 4时,则后续对应位置为4+ 2 * 5 - 2 = 12,依此类推。

(5)对于中间行,当列数为奇数时,其对应位置关系为:start + 2 * (总行数 - 当前行 - 1);当列数为偶数时,其对应关系为:start + 2 * 当前行,其中当前列从0开始

。例如,对于第三行的起始start = 3,其后续位置所在列为1,是奇数列,则后续位置为 3 + 2 * (5 - 3 -1)= 5 ,此时start = 5,则其后续位置所在列数为4,是偶数

列,则后续位置为5 + 2 * 3= 11。

这道题有点类似数学中的归纳和总结相关的题目,其考的不是编程的技巧,而是通过发现规律,并对其进行分析,从而达到解题的目的。总体上感觉,要想算法比较好,扎实的数

学功底很有必要,所以,在业余时间,多花时间学数学也是很有必要的。这里推荐几本和计算机相关的数学书籍:《程序员的数学》、《具体数学》、《质数的孤独》。希望对你

有所帮助,也希望大家分享各自的学习心得和体会。

解题代码如下:

public static String convert(String s, int nRows) {
	if (nRows <= 0)
		return "";
	if (nRows == 1 || nRows >= s.length())
		return s;
	StringBuffer buffer = new StringBuffer();
	int len = s.length();
	for (int i = 0; i < len && i < nRows; ++i) {
		// 在字符串中的变化的位置
		int start = i;
		buffer.append(s.charAt(start));
		for (int j = 1; start < len; ++j) {
			// 第一行和最后一行
			if (i == 0 || i == nRows - 1) {
				start = start + 2 * nRows - 2;
			} else {
				// 对于中间行,在字符串中位置为基数时
				if (j % 2 == 1) {
					start = start + 2 * (nRows - i - 1);
				} else {
					// 位置为偶数时
					start = start + 2 * i;
				}
			}
			// 边界判断
			if (start < len)
				buffer.append(s.charAt(start));
		}
	}
	return buffer.toString();
}

Leetcode_6_ZigZag Conversion的更多相关文章

  1. Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ...

    Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ... 这个错误是因为有两个相 ...

  2. View and Data API Tips : Conversion between DbId and node

    By Daniel Du In View and Data client side API, The assets in the Autodesk Viewer have an object tree ...

  3. 【leetcode】ZigZag Conversion

    题目简述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...

  4. Conversion Operators in OpenCascade

    Conversion Operators in OpenCascade eryar@163.com Abstract. C++ lets us redefine the meaning of the ...

  5. No.006:ZigZag Conversion

    问题: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  6. 错误提示:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 的解决方法

    最近在win7 系统下,打算利用 cmake 生成项目文件,然后用vs2010进行编译.但是在cmake的时候出现错误弹窗:

  7. ZigZag Conversion leetcode java

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  8. VS2010 LINK1123:failure during conversion to COFF:file invalid or corrupt

    今天用Visual Studio 2010编译一个C工程时突然遇到下面这个编译错误.fatal error LINK1123:failure during conversion to COFF:fil ...

  9. 【leetcode❤python】 6. ZigZag Conversion

    #-*- coding: UTF-8 -*- #ZigZag Conversion :之字型class Solution(object):    def convert(self, s, numRow ...

随机推荐

  1. C++重载输入流复习

    C++重载输入流 #include <bits/stdc++.h> using namespace std; struct Point { int x, y; Point(int xx, ...

  2. 在linux系统中I/O 调度的选择

        I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能. 在linux下面列出4种调度算法 CFQ (Compl ...

  3. 计算机网络之万维网WWW

    万维网 WWW (World Wide Web)并非某种特殊的计算机网络,而是一个大规模的.联机式的信息储藏所. 万维网用链接的方法能非常方便地从因特网上的一个站点访问另一个站点,从而主动地按需获取丰 ...

  4. Gradle 1.12用户指南翻译——第五十二章. Maven 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...

  5. Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室

    思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的 ...

  6. Win7下安装linux虚拟机

    关于如何在Win7下搭建linux学习环境,特在此分享下. 一.工具 1.VMware-workstation-full-9.0.0-812388.exe       下载地址:http://pan. ...

  7. 类型转换异常处理java.lang.RuntimeException

    前几天在做一个安卓项目的时候一直报java.lang.RuntimeException错,一直调试不出来,今天突然又灵感是不是文件配置出错了,果然在清单文件中少了一句 android:name=&qu ...

  8. 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出

    在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把 ...

  9. activiti实战系列 排他网关(ExclusiveGateWay)

    流程图 12.2:部署流程定义+启动流程实例 12.3:查询我的个人任务 12.4:完成我的个人任务 说明: 1)     一个排他网关对应一个以上的顺序流 2)     由排他网关流出的顺序流都有个 ...

  10. SQLite 分离数据库(http://www.w3cschool.cc/sqlite/sqlite-detach-database.html)

    SQLite 分离数据库 SQLite的 DETACH DTABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 ATTACH 语句附加的.如果同一个数据库文件已经被附加上 ...