字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion
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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation: P I N
A L S I G
Y A H R
P I
个人思路:
先计算出列数,用二维数组处理
然后分为字符落在竖和斜杠两种情况
竖:分为是否可以落满行的个数
斜杠同理
同时计算出当前竖的第一个值的列号
public String convert(String s, int numRows) {//ZigZag Conversion
int len=s.length();
if(numRows==1||s==null||s.equals(" ")||len<=numRows) return s;
else{
char[] result=new char[len];
char[] cs=s.toCharArray();
int cLen = 0;
int split1=2*(numRows-1);
int nDouble=len/split1;
if(len%split1==0){
cLen=(1+numRows-2)*nDouble;
}else if(len%split1<=numRows){
cLen=(1+numRows-2)*nDouble+1;
}else{
cLen=(1+numRows-2)*nDouble+(len%split1)-(numRows-1);
}
char[][] ch=new char[numRows][cLen];
int dif=split1;
for(int k=0;k<len;k++){
// System.out.println("start++++::::"+k);
if(k%dif==0){ //up start
int t=k>0?(k/2):0;
if(k+numRows>len){
for(int j=0;j<len-k;j++){
// System.out.println("45-----"+j+","+t+"="+(k+j));
ch[j][t]=cs[k+j];
}
k=len-1;
break;
}else{
for(int j=0;j<numRows;j++){
// System.out.println("52-----"+j+","+t+"="+(k+j));
ch[j][t]=cs[k+j];
}
k=k+numRows-2;
}
}else if((k%dif==(numRows-1))){//down start
// System.out.println(k);
int t=k+1-numRows>0?((k+1-numRows)/2):0;
int tt=numRows-1;
if(k+numRows-2>=len){
for(int j=0;j<len-k-1;j++){
--tt;
++t;
// System.out.println("64-----"+tt+","+t+"="+cs[k+j+1]);
ch[tt][t]=cs[k+j+1];
}
k=len-1;
break;
}else{
for(int j=0;j<numRows-2;j++){
--tt;
++t;
// System.out.println("t:"+tt);
// System.out.println("70-----"+tt+","+t+"="+cs[k+j+1]);
ch[tt][t]=cs[k+j+1];
}
k=k+numRows-2;
// System.out.println("79----"+k);
}
}
}
int next=0;
for(int i=0;i<ch.length;i++){
for(int j=0;j<ch[0].length;j++){
// System.out.print(ch[i][j]);
if(ch[i][j]!='\u0000'){
result[next++]=ch[i][j];
}
}
}
return new String(result);
}
}
字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion的更多相关文章
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- 关于android中调用系统拍照,返回图片是旋转90度
转载博客:http://blog.csdn.net/walker02/article/details/8211628 项目开发中遇到的一个问题,对于三星手机在做手机照片选择时出现图片显示不正常,研究后 ...
- 移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)
背景: 本人的一个移动端H5项目,需求如下: 需求一:手机相册选取或拍摄照片后在页面上预览 需求二:然后绘制在canvas画布上 这里,我们先看一个demo(http://jsfiddle.net/q ...
- 利用exif.js解决ios手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- 解决ios手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- PyOpenCV图像逆时针旋转90度
warpAffine方法效果很搓,留下大片黑色区域. 使用flip和transpose可以实现逆时针旋转90度.先flip或先transpose均可. #coding:utf-8 import cv2 ...
- MTK 屏幕旋转90度
http://blog.csdn.net/ouo555/article/details/44806837 1.屏幕显示顺时针旋转90度 lk 横屏logo,顺时针旋转90度显示修改bootable/b ...
- C++ 方阵原地旋转90度
不额外申请内存(另外的一个二维数组空间),将一个方阵(二维数组)原地旋转90度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...
随机推荐
- MobileForm控件的使用方式-用.NET(C#)开发APP的学习日志
今天继续Smobiler开发APP的学习日志,这次是做一个title.toolbar.侧边栏三种效果 样式一 一. Toolbar 1. 目标样式 我们要实现上图中的效果 ...
- myeclipse附加源码进行查看的方法
在编程过程中,有可能需要用到看源码的情况,那么怎么进行添加源码呢,这里做下记录 首先,先下载javaEE源码(可在网上自由下载) 1.在HttpServlet上右键-->Open Declara ...
- xss攻击和csrf攻击的定义及区别
1.CSRF的基本概念.缩写.全称 CSRF(Cross-site request forgery):跨站请求伪造. PS:中文名一定要记住.英文全称,如果记不住也拉倒. 2.CSRF的攻击原理 用户 ...
- .net之设计模式
在上一篇文章里我通过具体场景总结了“.net面向对象的设计原则”,其中也多次提到一些设计模式方面的技术,可想而知,设计模式在我们的开发过程中也是必不可少的.今天我们就来简单交流下设计模式.对于设计模式 ...
- 如何通过免费开源ERP Odoo建立你的团队, 销售过程和目标
这种快速的一步一步的指南将引导您完成Odoo CRM, 帮助您轻松处理您的销售渠道, 时刻从线索到客户管理您的销售渠道. 配置 从 Odoo初始化后,生成你的数据库, 选择CRM 作为第一个app安装 ...
- cesium 之加载地形图 Terrain 篇(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- 阿里巴巴excel工具easyexcel 助你快速简单避免OOM
Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...
- Linux运维老司机:CentOS6.9配置安装并配置Rsync
一.rsync简介 rsync全称remote sync,是一种更高效.可以本地或远程同步的命令,之所以高效是因为rsync会对需要同步的源和目的进度行对比,只同步有改变的部分,所以比scp命令更高效 ...
- Android开发:文本控件详解——TextView(一)基本属性
一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...
- Python基础(random模块)
random 常用的方法: #Author : Kelvin #Date : 2019/1/6 15:33 import random print(random.random()) #产生0-1之间的 ...