如何仅反转字符串中的数字
how to reverse only numbers in a string
输入:123ABC458
输出:321ABC854
public static void main(String []args){
String str="123ABC564";
int count=0;
int ans=0;
int firstindex=0;
char[] ch = str.toCharArray();
for(int i=0;i<ch.length;i++){
if(Character.isDigit(ch[i])){
if(ans==0){
firstindex=i;
}
count++;
}
else{
int lastindex=count+firstindex-1;
while(firstindex<lastindex){
char temp=ch[firstindex];
ch[firstindex]=ch[lastindex];
ch[lastindex]=temp;
firstindex++;
lastindex--;
}
ans=0;
count=0;
firstindex=0;
}
}
for (char c : ch){
System.out.print(c);
}
}
}
谁能告诉我这段代码有什么问题
我使用这段代码得到的输出是 12BA3C564
这是使用字符串拆分的简洁版本:
String input = "123ABC458";
String[] parts = input.split("(?<=\D)(?=\d)|(?<=\d)(?=\D)");
StringBuilder sb = new StringBuilder();
for (String part : parts) {
if (part.matches("\d+")) {
StringBuilder num = new StringBuilder(part);
sb.append(num.reverse());
}
else {
sb.append(part);
}
}
System.out.println(sb.toString()); // 321ABC854
上面使用的拆分操作生成了一个由数字或字母组成的字符串数组。然后,我们迭代该数组并使用 StringBuilder#reverse
.
有选择地反转数字字符串
您可以使用Java regex API和StringBuilder
轻松解决。正则表达式 \d+
指定一位或多位数字。使用 Java 正则表达式 API,您可以找到可用于构建所需字符串的数字、它们的开始位置和结束位置。
演示:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// Tests
String[] samples = { "123ABC458", "123ABC458XYZ", "123ABC458XYZ367", "ABC123XYZ", "ABC123XYZ" };
for (String s : samples)
System.out.println(numbersInverted(s));
}
static String numbersInverted(String str) {
StringBuilder sb = new StringBuilder();
Matcher matcher = Pattern.compile("\d+").matcher(str);
int lastInitialPos = 0;
while (matcher.find()) {
int start = matcher.start();
String inverted = new StringBuilder(matcher.group()).reverse().toString();
sb.append(str.substring(lastInitialPos, start)).append(inverted);
lastInitialPos = matcher.end();
}
if (sb.length() == 0) // If no number was found
return str;
else
return sb.append(str.substring(lastInitialPos)).toString();
}
}
输出:
321ABC854
321ABC854XYZ
321ABC854XYZ763
ABC321XYZ
ABC321XYZ
第一步可以把字符串中的所有数字都取出来,然后用数字反转的字符串替换输入。示例:
public static void main(String[] args)
{
String input = "123ABC458";
Matcher m = Pattern.compile("\d+").matcher(input);
while(m.find())
input = input.replace(m.group(), new StringBuilder(m.group()).reverse());
System.out.println(input);
}
这个任务可以在没有正则表达式的情况下实现,将输入字符串拆分为子字符串等,仅在 StringBuilder::insert(int offset, char c)
和 StringBuilder::append(char c)
的帮助下使用 insert
的简单索引计算:
public static String revertDigits(String str) {
if (str == null || str.isEmpty()) {
return str;
}
StringBuilder sb = new StringBuilder(str.length());
for (int i = 0, j = 0, n = str.length(); i < n; i++) {
char c = str.charAt(i);
if (Character.isDigit(c)) {
sb.insert(j, c); // append in "reverse" mode
} else {
sb.append(c);
j = i + 1; // store the last position of a non-digit
}
}
return sb.toString();
}
测试:
String str="123ABC564";
System.out.println(str + '\n' + revertDigits(str));
输出
123ABC564
321ABC465
Can anyone tell me what's wrong with this code
我相信我在您的代码中发现了两个错误:
- 您永远不会将
ans
设置为 0
以外的任何其他值。所以你的 if
条件 ans==0
将永远为真。如果我正确理解了该变量的用途,您可能希望将其替换为 boolean
之类的 insideNumber
并在检测到数字时将其设置为 true
并设置为 false
当你检测到一个字符不是数字时。您的 if
语句将变为 if (insideNumber)
…
- 您没有考虑字符串末尾的数字。您可以通过在字符串中附加一个字母来检查此语句,然后看到
564
将反转为 465
。要正确反转尾随数字:在循环后再次检查您是否在数字内,如果是,则将最后一个数字从 firstindex
反转到字符串末尾。
作为替代解决方案,从 Java 9 开始,您还可以使用 Matcher#replaceAll 并反转 1 个或多个数字的每个匹配项。
String result = Pattern.compile("\d+")
.matcher("123ABC458")
.replaceAll(m -> new StringBuilder(m.group()).reverse().toString());
System.out.println(result);
输出
321ABC854
输入:123ABC458 输出:321ABC854
public static void main(String []args){
String str="123ABC564";
int count=0;
int ans=0;
int firstindex=0;
char[] ch = str.toCharArray();
for(int i=0;i<ch.length;i++){
if(Character.isDigit(ch[i])){
if(ans==0){
firstindex=i;
}
count++;
}
else{
int lastindex=count+firstindex-1;
while(firstindex<lastindex){
char temp=ch[firstindex];
ch[firstindex]=ch[lastindex];
ch[lastindex]=temp;
firstindex++;
lastindex--;
}
ans=0;
count=0;
firstindex=0;
}
}
for (char c : ch){
System.out.print(c);
}
}
}
谁能告诉我这段代码有什么问题 我使用这段代码得到的输出是 12BA3C564
这是使用字符串拆分的简洁版本:
String input = "123ABC458";
String[] parts = input.split("(?<=\D)(?=\d)|(?<=\d)(?=\D)");
StringBuilder sb = new StringBuilder();
for (String part : parts) {
if (part.matches("\d+")) {
StringBuilder num = new StringBuilder(part);
sb.append(num.reverse());
}
else {
sb.append(part);
}
}
System.out.println(sb.toString()); // 321ABC854
上面使用的拆分操作生成了一个由数字或字母组成的字符串数组。然后,我们迭代该数组并使用 StringBuilder#reverse
.
您可以使用Java regex API和StringBuilder
轻松解决。正则表达式 \d+
指定一位或多位数字。使用 Java 正则表达式 API,您可以找到可用于构建所需字符串的数字、它们的开始位置和结束位置。
演示:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// Tests
String[] samples = { "123ABC458", "123ABC458XYZ", "123ABC458XYZ367", "ABC123XYZ", "ABC123XYZ" };
for (String s : samples)
System.out.println(numbersInverted(s));
}
static String numbersInverted(String str) {
StringBuilder sb = new StringBuilder();
Matcher matcher = Pattern.compile("\d+").matcher(str);
int lastInitialPos = 0;
while (matcher.find()) {
int start = matcher.start();
String inverted = new StringBuilder(matcher.group()).reverse().toString();
sb.append(str.substring(lastInitialPos, start)).append(inverted);
lastInitialPos = matcher.end();
}
if (sb.length() == 0) // If no number was found
return str;
else
return sb.append(str.substring(lastInitialPos)).toString();
}
}
输出:
321ABC854
321ABC854XYZ
321ABC854XYZ763
ABC321XYZ
ABC321XYZ
第一步可以把字符串中的所有数字都取出来,然后用数字反转的字符串替换输入。示例:
public static void main(String[] args)
{
String input = "123ABC458";
Matcher m = Pattern.compile("\d+").matcher(input);
while(m.find())
input = input.replace(m.group(), new StringBuilder(m.group()).reverse());
System.out.println(input);
}
这个任务可以在没有正则表达式的情况下实现,将输入字符串拆分为子字符串等,仅在 StringBuilder::insert(int offset, char c)
和 StringBuilder::append(char c)
的帮助下使用 insert
的简单索引计算:
public static String revertDigits(String str) {
if (str == null || str.isEmpty()) {
return str;
}
StringBuilder sb = new StringBuilder(str.length());
for (int i = 0, j = 0, n = str.length(); i < n; i++) {
char c = str.charAt(i);
if (Character.isDigit(c)) {
sb.insert(j, c); // append in "reverse" mode
} else {
sb.append(c);
j = i + 1; // store the last position of a non-digit
}
}
return sb.toString();
}
测试:
String str="123ABC564";
System.out.println(str + '\n' + revertDigits(str));
输出
123ABC564
321ABC465
Can anyone tell me what's wrong with this code
我相信我在您的代码中发现了两个错误:
- 您永远不会将
ans
设置为0
以外的任何其他值。所以你的if
条件ans==0
将永远为真。如果我正确理解了该变量的用途,您可能希望将其替换为boolean
之类的insideNumber
并在检测到数字时将其设置为true
并设置为false
当你检测到一个字符不是数字时。您的if
语句将变为if (insideNumber)
… - 您没有考虑字符串末尾的数字。您可以通过在字符串中附加一个字母来检查此语句,然后看到
564
将反转为465
。要正确反转尾随数字:在循环后再次检查您是否在数字内,如果是,则将最后一个数字从firstindex
反转到字符串末尾。
作为替代解决方案,从 Java 9 开始,您还可以使用 Matcher#replaceAll 并反转 1 个或多个数字的每个匹配项。
String result = Pattern.compile("\d+")
.matcher("123ABC458")
.replaceAll(m -> new StringBuilder(m.group()).reverse().toString());
System.out.println(result);
输出
321ABC854