字符串按照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

Accepted

303,542

Submissions

970,790


个人思路:

先计算出列数,用二维数组处理

然后分为字符落在竖和斜杠两种情况

竖:分为是否可以落满行的个数

斜杠同理

同时计算出当前竖的第一个值的列号

    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);
        }

    }

原文地址:https://www.cnblogs.com/tk55/p/10703768.html

时间: 2024-12-16 12:37:53

字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion的相关文章

利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题

html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非横拍的ios照片进行角度旋转修正. 利用exif.js读取照片的拍摄信息,详见  http://code.ciaoca.com/javascript/exif-js/ 这里主要用到Orientation属性. Orientation属性说明如下: 旋转角度 参数 0° 1 顺时针90° 6 逆时针9

移动端上传照片 预览+draw on Canvas demo(解决iOS等设备照片旋转90度的bug)

背景: 本人的一个移动端H5项目,需求如下: 手机相册选取或拍摄照片后在页面上预览 然后绘制在canvas画布上. 这里,我们先看一个demo(http://jsfiddle.net/q3011893/83qfqpk8/embedded/) 操作步骤: 1.点击选择文件,拍摄一张照片,此时"预览:"文字下会显示你刚才拍摄的照片: 2.再点击"draw on Canvas",该按钮下的画布会绘制你刚才拍摄的照片. 正常的结果: 正文: 让input file支持拍照+

CC150:将一个矩阵旋转90度

一张图像表示成n X n的矩阵,写一个函数把图像旋转90度.不开辟额外的存储空间 我们假设要将图像逆时针旋转90度.原图如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 逆时针旋转90度后的图应该是: 4 8 12 16 3 7 11 15 2 6 10 14 1 5 9 13 我们要如何原地进行操作以达到上面的效果呢?可以分两步 第一步交换主对角线两侧的对称元素, 第二步交换第i行和第n-1-i行,即得到结果. 看图示: 原图:           第一

iOS开发- 相机(摄像头)获取到的图片自动旋转90度解决办法

http://www.tuicool.com/articles/IfEZre 今天写demo的时候发现, 如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转90度. 刚开始觉得莫名其妙, 不知所措. 后来百度了一下,找到了解决办法. ps: 查找过程中, 碰到了一种说法: //get original photo from iOS photos //如果该图片大于2M,会自动旋转90度:否则不旋转 UIImage* originalImg=[dict objec

O(1)空间复杂度实现n*n矩阵旋转90度

O(1)空间复杂度实现n*n矩阵旋转90度, #include <iostream> using namespace std; #define ARRAY_SIZE 5 void print_two_array (int a[][ARRAY_SIZE]) { cout << endl;    for (int i=0; i<ARRAY_SIZE; i++) { for (int j=0; j<ARRAY_SIZE; j++) {    cout << a[i

矩阵旋转90度(keep it up)

一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度. 你能原地进行操作吗?(即不开辟额外的存储空间) 这个题第一感觉就是一次交换矩阵的元素: 比如 3*3 矩阵 1 2 3 4 5 6 7 8 9 先处理第一行,一次逆时针旋转四个元素,下面是二次做的 3 2 9          3 6 9 4 5 6          2 5 8 1 8 7          1 4 7 第一次         第二次 如果是5*5的矩阵 1   2   3   4   5 6

将一个4X4的数组进行逆时针旋转90度后输出,要求原数组数据随机输入

//将一个4X4的数组进行逆时针旋转90度后输出,要求原数组数据随机输入 #include<stdio.h> int main() { int a[4][4],b[4][4],i,j;//a存放原是数组数据,b存放旋转后的数组数据 printf("please input 16 number:"); for(i=0;i<4;i++) for(j=0;j<4;j++) { scanf("%d",&a[i][j]); b[3-j][i]=

矩阵逆时针旋转90度,空间复杂度O(1)

将一个矩阵逆时针旋转90度,首先可以沿左上角-右下角斜对角线,进行上下交换数据,然后上下数据交换即可. 1 #include <stdio.h> 2 #include <stdlib.h> 3 //矩阵逆时针旋转90度 4 int main() 5 { 6 int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 7 int b[3][3]; 8 int i; 9 int j; 10 int temp; 11 printf("原始矩阵\n")

图片旋转90度解决的方法

假设把通过相机获取到的图片,直接进行操作, 比方裁剪, 缩放, 则会把原图片向又旋转90度. ps: 查找过程中, 碰到了一种说法: [objc] view plaincopy //get original photo from iOS photos //假设该图片大于2M,会自己主动旋转90度:否则不旋转 UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage]; 至于是否正确, 还没确定. 先M