6、z字形变换
题目描述
将一个给定字符串根据给定的行数,以从上往下、从左往右进行Z字形排列。比如输入字符串为“LEETCODEISHIRING”行数为 3 时,排列如下 :
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:
“LCIRETOESIIGEDHN” 。请你实现这个字符串进行制定行数变换的函数:
示例1:
示例2:
代码
class Solution {
public String convert(String s, int numRows) {
int len=s.length();
//判断非空性
if(s==null || len==0){
return "";
}
//如果numRows=1,则直接返回numRows
if(numRows==1){
return s;
}
//以f来分组
int f=numRows+numRows-2;
//共n组
int n=len/(numRows+numRows-2);
//多余m个数
int m=len%(numRows+numRows-2);
//辅助数组的行数
int row=numRows;
//辅助数组的列数
int col=m==0?n*(numRows-1):(n+1)*(numRows-1);
//辅助数组
Character[][] dp=new Character[row][col];
//遍历s
for(int i=0;i<len;i++){
//元素所在位置的第几组
int x=(i+1)/f;
//元素在组中的位置
int y=(i+1)%f;
//元素的横坐标
int rl=0;
//元素的竖坐标
int cl=0;
//如果y为0,说明元素位置在组的末尾
if(y==0){
rl=1;
cl=x*(numRows-1)-1;
}else if(y<=numRows){
//元素是在一列上的,所以竖坐标都是一样的
rl=y-1;
cl=x*(numRows-1);
}else{
//元素在组中的位置,横竖坐标都在变化
rl=numRows-1-(y-numRows);
cl=x*(numRows-1)+y-numRows;
}
//辅助数组的赋值
dp[rl][cl]=s.charAt(i);
}
StringBuilder sb=new StringBuilder();
//遍历数组,并追加到sb中
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(dp[i][j]!=null){
sb.append(dp[i][j]);
}
}
}
//返回string
return sb.toString();
}
}
链接: https://leetcode-cn.com/problems/zigzag-conversion/.
12.整数罗马数组
题目描述
罗马数字包含以下七种字符: I , V , X , L , C , D 和 M。
例如,罗马数字 2 写作 II ,即为两个并列的 1。12也写作 XII ,即为 X + II 。27写作 XXVII ,即为 XX + V +II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特列,例如 4 不写作 IIII , 而是 IV 。数字 1在 数字 5 的左边 ,所表示1的数等于大数 5 减小数 1 得到的数值 4 。同样的 , 数字9 表示为 IX 。这个特殊的规则只适用于以下六种情况:
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
示例1
示例2
示例3
示例4
代码
class Solution {
public String intToRoman(int num) {
StringBuilder sb=new StringBuilder();
//当num大于等于1000的时候,就循环取M
while(num>=1000){
num -=1000;
sb.append('M');
}
//当num小于1000,大于等于900时,取一个“CM”
if(num>=900){
num -=900;
sb.append('C');
sb.append('M');
}
//当num大于等于500,小于900时,取‘D’
if(num>=500){
num -=500;
sb.append('D');
}
//当num大于等于400,小于500时,取“CD”
if(num>=400){
num -=400;
sb.append('C');
sb.append('D');
}
//当num大于等于100,小于400时,循环取‘C’
while(num>=100){
num -=100;
sb.append('C');
}
//当num大于等于90,小于100时,取“XC”
if(num>=90){
num -=90;
sb.append('X');
sb.append('C');
}
//当num大于等于50,小于90时,取‘L’
if(num>=50){
num -=50;
sb.append('L');
}
//当num大于等于40,小于50时,取“XL”
if(num>=40){
num -=40;
sb.append('X');
sb.append('L');
}
//当num大于等于10,小于40时,循环取‘X’
while(num>=10){
num -=10;
sb.append('X');
}
//当num等于9时,直接取“IX”
if(num>=9){
num -=9;
sb.append('I');
sb.append('X');
}
//当num大于等于5时,取‘V’
if(num>=5){
num -=5;
sb.append('V');
}
//当num等于4时,取“IV”
if(num>=4){
num -=4;
sb.append('I');
sb.append('V');
}
//最后循环取‘I’,直至num为0
while(num>0){
num -=1;
sb.append('I');
}
//最后返回sb.toString()
return sb.toString();
}
}