zoukankan      html  css  js  c++  java
  • letcode 6 z字转换

    将一个字符串做z字形转换

    很容易想到暴力求解.  这里要注意的是, 静态方法不能新建内部类实例.

    class zigC implements Comparable<zigC>{
        public zigC(char c, int row, int col) {
            this.c = c;
            this.row = row;
            this.col = col;
        }
    
        char c;
        int row;
        int col;
    
        @Override
        public int compareTo(zigC o) {
            if(this.row!=o.row){
                return Integer.compare(this.row,o.row);
    
            }else{
                return Integer.compare(this.col,o.col);
            }
        }
    }
    public static String convert(String s, int numRows) {
    int len = s.length();
            ArrayList<zigC> zs = new ArrayList<zigC>();
            int row=0;
            int col=0;
            int dir=1;
            for(int i=0;i<len;i++){
                if((row==numRows)){
                    dir=-dir;
                    row-=2;
    
                }
                if(row==-1){
                    dir=-dir;
                    row+=2;
                }
                if(dir==1){
                    zigC tmp = new zigC(s.charAt(i),row++, col);
                    zs.add(tmp);
                }else{
                    zigC tmp = new zigC(s.charAt(i),row--,col++);
                    zs.add(tmp);
                }
            }
            StringBuilder res = new StringBuilder(len);
            Collections.sort(zs);
            for (zigC z:zs) {
                //System.out.print(z.c);
                res.append(z);
            }
            return res.toString();
    }

    其实可以不用结构体,直接z字形遍历就行

    public static String solve(String s, int numRows){
            int len = s.length();
            if(numRows>len||numRows==1) return s;
            ArrayList<StringBuilder> z = new ArrayList<>();
            for(int i=0;i<numRows;i++){
                z.add(new StringBuilder());
            }
            int dir=-1;
            int row=0;
            for(int i=0;i<len;i++){
                if(row==0||row==numRows-1) dir=-dir;
                z.get(row).append(s.charAt(i));
    
                row+=dir;
            }
            StringBuilder res = new StringBuilder(len);
            for(StringBuilder ss:z){
                res.append(ss);
            }
            return res.toString();
        }

    还有一种更牛的做发,直接找到规律:

    作者:LeetCode
    链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/z-zi-xing-bian-huan-by-leetcode/




        public static String convert(String s, int numRows) {
                    if (numRows == 1) return s;
    
            StringBuilder ret = new StringBuilder();
            int n = s.length();
            int cycleLen = 2 * numRows - 2;
    
            for (int i = 0; i < numRows; i++) {
                for (int j = 0; j + i < n; j += cycleLen) {
                    ret.append(s.charAt(j + i));
                    if (i != 0 && i != numRows - 1 && j + cycleLen - i < n)
                        ret.append(s.charAt(j + cycleLen - i));
                }
            }
            return ret.toString();
    
    
    
        }
  • 相关阅读:
    怎样才有资格被称为开源软件
    [翻译]开发Silverlight 2.0的自定义控件
    网上Silverlight项目收集
    Google 分析的基准化测试
    IIS 承载的WCF服务失败
    Lang.NET 2008 相关Session
    Silverlight 2.0 beta1 堆栈
    asp.net 性能调较
    SQL Server 2005 的nvarchar(max),varchar(max)来救火
    LINQPad
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/12451617.html
Copyright © 2011-2022 走看看