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 a method convert(“PAYPALISHIRING”, 3) which returns “PAHNAPLSIIGYIR”.
Java Solution
public String convert(String s, int numRows) { if (numRows == 1) return s; StringBuilder sb = new StringBuilder(); // step int step = 2 * numRows - 2; for (int i = 0; i < numRows; i++) { //first & last rows if (i == 0 || i == numRows - 1) { for (int j = i; j < s.length(); j = j + step) { sb.append(s.charAt(j)); } //middle rows } else { int j = i; boolean flag = true; int step1 = 2 * (numRows - 1 - i); int step2 = step - step1; while (j < s.length()) { sb.append(s.charAt(j)); if (flag) j = j + step1; else j = j + step2; flag = !flag; } } } return sb.toString(); } |
What exactly is a Zigzag pattern? why is the 2nd column only having 1 character? I’ve been googling around and not finding out what they want.
not sure what is point in this ?
lets say someone will ask / and now print those chars in true zigzag fashion w/ proper number of blanks on each line/
what should i do ? write another piece of code?
better either return array of strings, at least it is clear what to do next, or insert proper number blanks into string
to get same length for each line
what do you think ?
string s;
cin>>s;
int k;
cin>>k;
vector v[k];
bool swapping;
for(int i = 0; i < s.length(); i++){
if(i%(2*k-2)==0)swapping=true;
else if(i%(k-1)==0)swapping=false;
int tmp = i%(k-1);
if(swapping){
result[tmp].push_back(s[i]);
}
else{
result[k-1-tmp].push_back(s[i]);
}
}
for(int i = 0; i < k; i++){
for(int j = 0; j < v[i].size(); j++){
cout<<v[i][j];
}
}
Here is an alternative solution that works.
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
List<List> rows = new ArrayList<List>();
for (int i = 0; i < numRows; i++) {
rows.add(new ArrayList());
}
boolean add = true;
int z = 0;
for (int i = 0; i
= numRows-1) {add = false;
} else if (!add && z <= 0) {
add = true;
}
if (add) {
z++;
} else {
z--;
}
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < numRows; i++) {
sb.append(String.join("", rows.get(i)));
}
return sb.toString();
}
The examples should be given at least 3 and 4.