力扣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 + "次循环");
}
}