执行操作后字典序最小的字符串

力扣1625:

需求:

给你一个字符串 s 以及两个整数 a 和 b 。其中,字符串 s 的长度为偶数,且仅由数字 0 到 9 组成。

你可以在 s 上按任意顺序多次执行下面两个操作之一:

累加:将  a 加到 s 中所有下标为奇数的元素上(下标从 0 开始)。数字一旦超过 9 就会变成 0,如此循环往复。例如,s = "3456" 且 a = 5,则执行此操作后 s 变成 "3951"。
轮转:将 s 向右轮转 b 位。例如,s = "3456" 且 b = 1,则执行此操作后 s 变成 "6345"。
请你返回在 s 上执行上述操作任意次后可以得到的 字典序最小 的字符串。

如果两个字符串长度相同,那么字符串 a 字典序比字符串 b 小可以这样定义:在 a 和 b 出现不同的第一个位置上,字符串 a 中的字符出现在字母表中的时间早于 b 中的对应字符。例如,"0158” 字典序比 "0190" 小,因为不同的第一个位置是在第三个字符,显然 '5' 出现在 '9' 之前。

来源:力扣(LeetCode)

代码实现: 

import java.util.Random;

public class lc_1625 {

    public StringBuilder lunzhuan(StringBuilder s, int b) {
        String s1 = String.valueOf(s);
        //如果使用  StringBuilder s1 = s; 则会复制地址值,会导致修改同步
        for (int i = 0; i < s1.length(); i++) {
            int x;
            if (i + b >= s1.length()) {
                x = i + b - s1.length();
            } else {
                x = i + b;
            }
            char z = s1.charAt(i);
            s.setCharAt(x, z);

        }
        System.out.println("轮转: " + s);
        return s;
    }

    public StringBuilder leijia(StringBuilder s, int a) {//累加方法,返回累加后的集合
        //累加:将a 加到 s 中所有下标为奇数的元素上(下标从 0 开始)。数字一旦超过 9 就会变成 0,如此循环往复。
        StringBuilder s2 = s;
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 1) {
                int plus = Integer.parseInt(String.valueOf(s.charAt(i))) + a;//直接(int)强转会拿到ASCII码
                if (plus > 9) {
                    plus = plus - 10;
                }
                s2.setCharAt(i, (char) (plus + '0'));
            }
        }
        System.out.println("累加: " + s2);
        return s2;
    }

    public static void main(String[] args) {
        lc_1625 l = new lc_1625();
        int a = 7;
        int b = 3;
        StringBuilder substring = new StringBuilder("498156161");
        String sub;//记录循环一次后的数字(从StringBuilder转换)
        String min = "99999999999999999";
        String yuan = "498156161";//原数值
        System.out.println("初态: " + yuan);
        // 生成 Random 对象
        Random random = new Random();

        /// String sub=null;
        int flag = 0;//记录最小值时循环次数
        int number;//随机数
        for (int j = 0; j < 10000; j++) {
            number = random.nextInt(2);

            if (number == 0) {
                substring = l.leijia(substring, a);//修改数组
            } else {
                substring = l.lunzhuan(substring, b);
            }
            sub = String.valueOf(substring);
            if (sub.compareTo(min) < 0) {
                min = sub;//如果小于现有数字则修改
                flag = j;
            }
            if (sub.compareTo(yuan) == 0) {
                System.out.println("第:" + j + "次循环后与原数据相等");
                break;
            }
        }
        System.out.println("无法获得字典序小于 " + min + "  第" + flag + "次循环");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值