本文是在学习中的总结,欢迎转载但请注明出处: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++/CLI、CLR

    1.什么是托管C++? 在回答这个问题,首先要搞清楚什么是"托管"(Managed).托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完 ...

  2. dubbo服务的发布和调用

    Dubbo是分布式服务架构,是一个优秀的开源服务型框架,使得应用可以通过高性能的rpc实现服务的输入和输出功能.其实dubbo就是资源调度和治理中心的管理工具. 发布dubbo服务:在提供服务的应用中 ...

  3. [self init]

    在字典转模型中遇到了这样的代码: #import "HMAppInfo.h" @implementation HMAppInfo - (instancetype)initWithD ...

  4. ACM Let the Balloon Rise

    Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the ...

  5. Docker的Fig 项目

    在你的应用里面添加一个 fig.yml 文件,并指定一些简单的内容,执行 fig up 它就能帮你快速建立起一个容器 快速搭建基于 Docker 的隔离开发环境 使用 Dockerfile 文件指定你 ...

  6. springMVC源码--Controller控制器

    springMVC给我们提供Controller控制器,用来实现我们的逻辑处理,在Controller接口中定义的方法也是比较简单的,如下: Controller接口及实现类:

  7. 给大家安利一个学习angular2的视频网站

    本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 视频地址: https://egghead.io/courses/angular-2-fundamen ...

  8. 23 服务IntentService Demo6

    MainActivity.java package com.qf.day23_service_demo2; import android.app.Activity; import android.co ...

  9. Centos6.5 mysql安装

    cenos中安装软件使用yum进行安装,小米加步枪不如ak47. 第1步.yum安装mysql   yum -y install mysql-server 第2步.设置开机启动   chkconfig ...

  10. 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

     1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...