日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2019-02-24-算法-进化

發(fā)布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2019-02-24-算法-进化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述
將一個給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串為 “LEETCODEISHIRING” 行數(shù)為 3 時,排列如下:

L C I R E T O E S I I G E D H N

之后,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個新的字符串,比如:“LCIRETOESIIGEDHN”。
請你實現(xiàn)這個將字符串進行指定行數(shù)變換的函數(shù):

string convert(string s, int numRows);

示例 1:

輸入: s = "LEETCODEISHIRING", numRows = 3 輸出: "LCIRETOESIIGEDHN"

示例 2:

輸入: s = "LEETCODEISHIRING", numRows = 4 輸出: "LDREOEIIECIHNTSG" 解釋:L D R E O E I I E C I H N T S G

我的解決方案
使用坐標(biāo)法,建立x軸、y軸,計算每個字符所處的位置
二維坐標(biāo):
y:處于多少行
x:每行元素的相對位置

public static String convert(String s, int numRows) {if(numRows < 2 || s==null || s.length()<=1) {return s;}Character[][] c = new Character[numRows][s.length()/2 + 1];int x=0,y=0;for(int i=0;i<s.length();i+=2*(numRows-1)) {y =0;//每個字符必定有其位置for(int j=0;j<numRows && (i + j)<s.length();j++) {c[y++][x] = s.charAt(i + j);}y = numRows-2;if(y>0) {for(int k=numRows;k<2*(numRows-1) && (i + k)<s.length(); k++) {c[y--][++x] = s.charAt(i+k);}}x++;}StringBuilder result = new StringBuilder();for(int i=0;i<numRows;i++) {for(int j=0;j<s.length()/2 + 1;j++) {if(c[i][j] != null) {result.append(c[i][j]);}}}return result.toString();}

改進方案

本以為此算法除了建立二維數(shù)組,浪費一部分空間之外,時間復(fù)雜度很難優(yōu)化了。看了參考答案之后,豁然開朗,原來,不必計算二維坐標(biāo)值,每行元素的位置,在從左至右遍歷的時候,就已經(jīng)有序了。只需要記錄元素在第幾行就可以了。
改進后的算法:

public static String convert(String s, int numRows) {if(numRows == 1) {return s;}List<StringBuilder> arrList = new ArrayList<StringBuilder>();for(int i=0; i<Math.min(s.length(), numRows);i++) {arrList.add(new StringBuilder());}int row=0;boolean changeDirect = true;for(char c:s.toCharArray()) {arrList.get(row).append(c);changeDirect = (row == 0 || row == numRows -1)?!changeDirect:changeDirect;row = row + (changeDirect?-1:1);}StringBuilder rep = new StringBuilder();for(StringBuilder sb : arrList) {rep.append(sb);}return rep.toString();}

代碼邏輯更加清晰,更加便于維護,并且減少了部分運算量,執(zhí)行速度提高了近一倍。

持續(xù)精進,加油!

總結(jié)

以上是生活随笔為你收集整理的2019-02-24-算法-进化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。