leetcode题目:6.Z字形变换,12.整数罗马数组

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();
    }
}

在这里插入图片描述

链接: https://leetcode-cn.com/problems/integer-to-roman/.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值