zoukankan      html  css  js  c++  java
  • Zigzag convert

    public static String Convert(String s,int row) {
    		char[] c=s.toCharArray();
    		int len=s.length();
    		StringBuilder[] stringBuilders=new StringBuilder[row];
    		for (int i = 0; i < row; i++) {
    			stringBuilders[i]=new StringBuilder();
    		}
    
    		int i=0;
    		while(i<len){
    			for (int j = 0; j < row&&i<len; j++) {
    				stringBuilders[j].append(c[i++]);
    			}
    			for (int j =row-2; j >=1; j--) {
    				stringBuilders[j].append(c[i++]);
    			}
    		}
    		for (int j = 1; j < stringBuilders.length; j++) {
    			stringBuilders[0].append(stringBuilders[j]);
    		}
    		return stringBuilders[0].toString();
    	}
    
    /*思路:
    	1. 首先是按行输出,每行输出相同位置的下一间隔为row*2-2,行游标0<i<row;
    	2. 行内输出,考虑中间斜向部分,首行和末行,直接打印空格,中间部分,需要打印斜向字符及前后空格
    		斜向部分字符在字符串中的坐标为span+j-2*i,其中j为行内游标(列游标)
    		斜向字符前面空格数为row-2-i,斜向字符后空格数为i-1
            3. 为什么是span+j-2*i?
        	初始化时(每一行的首个斜向部分),j=i,字符位置为span-i+(j-i),其中j-i==0;
        	也必须这样初始化,因为要打印出首列的字符,通过j=i初始化,完成j的自增1,还能控制本行下一字符的输出;
        	第二个斜向部分,j+=span,字符位置为span*2-i==span-i+(j+=span)-i==span+j-2*i;
        	....
        	重点是:span-i是位置,配合行内游标j,使得位置可以行内自增,但是要减去初始化的值,即j=i;
        	所以,有了span-i+j-i,即span+j-2*i*/
    	public static void printZigZag(String s,int row) {
    		if (s.length()==0||row<1) {
    			return;
    		}
    		if (row==1) {
    			System.out.println(s);;
    		}
    		
    		int span=row*2-2;
    		int zig=row-2;
    		//控制行打印
    		for (int i = 0; i < row; i++) {
    			//控制每行,垂直列上的输出,间隔为span
    			for (int j = i; j < s.length(); j+=span) {
    				System.out.print(s.charAt(j));
    				//控制中间斜向部分的输出,其中斜向输出字符在字符串中的位置为span+j-2*i
    				if (i!=0&&i!=row-1&&span+j-2*i<s.length()) {
    					for (int j2 = 0; j2 < zig-i; j2++) {
    						System.out.print("  ");
    					}
    					System.out.print(s.charAt(span+j-2*i));
    				for (int j2 = 0; j2 < i-1; j2++) {
    					System.out.print("  ");
    				}
    				}
    				else {
    					for (int j2 = 0; j2 < zig; j2++) {
    						System.out.print("  ");
    					}
    				}
    			}
    			System.out.println();
    		}
    	}
    	
    	
    


    I am a slow walker, but I never walk backwards.



  • 相关阅读:
    i.MX6ULL使用寄存器配置GPIO
    i.MX6ULL的GPIO简要介绍。
    stm32的2个can控制器,主从理解
    ST-Link串口驱动安装--ST-Link VCP Ctrl驱动安装失败解决
    大漠穷秋叫狼哥哥要学好的书
    JQuery UI datepicker 经验
    JQuery UI datepicker 使用方法
    前端-细节处理笔记
    Grunt 前端自动化组件 收集
    JS deBug 技巧
  • 原文地址:https://www.cnblogs.com/lknny/p/4836194.html
Copyright © 2011-2022 走看看