在给定的字符数组中将“ *”替换为“-”

时间:2019-12-01 05:21:33

标签: java

  

给出的字符数组是

char[] arr = {123*4*5}

  

输出应为

String str = "123-4-5"

3 个答案:

答案 0 :(得分:3)

1)这不是您声明char数组的方式。如评论中所指出的,它应该是:

char[] arr = {'1','2','3','*','4','*','5'};

2)如果您想要String,为什么不以String开始呢?

3)您可以从String构造一个char[]并使用String.replace(char oldchar, char new char),它是Google搜索的第一个结果。代码:

char[] arr = {'1','2','3','*','4','*','5'};
String str = String.valueOf(arr).replace('*', '-');

4)如果需要在制作char[]之前在String上进行操作,则可以简单地遍历数组:

char[] arr = {'1','2','3','*','4','*','5'};
for(int i=0; i<arr.length; i++)
    if(arr[i] =='*') arr[i] = '-';
String str = String.valueOf(arr); 

编辑:基于与OP的评论和讨论,问题似乎与发布的完全相同。那就是:

char[] arr = {xxx*y*z};
String str = transformCharArr(arr); 

对于arr={123*4*5}str = "123-4-5"arr={122*2}str = "122-2"

因此,我做了一个小功能,可以实现上述功能并解决这两种情况。

假设:

1)xxx始终是一个三位数,最小为100,最大为999。

2)y是非零的1位数[1-9],与z相同。

3)在y或z等于1的情况下,如果乘以1,则忽略该结果。

4)xxx总是最小化。也就是说,对于123*4*5,相对于xxx> = 100的假设(1),实现这一目标的最低可能的xxx为123。

5)y和z最大化,其中z倾向于最大化。同样关于两个假设(2)。

因此,代码为:

static String transformCharArr(char[] arr){
    if(arr.length > 1) return ""; // array should only contain 1 element
    int value = (int)arr[0]; // using int since char is the only unisgned 2-byte type in all of Java, short isn't enough given MAX(short) = 32,767 while max(char) = 65,535
    short xxx=100, y=1, z=1; // all shorts since they never exceed certain limits
    int product = 0; // to stop the loop, int because short*short*short gives int type, and product is comparable to value, so it has to support more than max(short)
    for(xxx=100; xxx<=999; xxx++){ // first loop xxx to minimize it
        for(y=1; y<=9; y++){ // loop y before z to favor maximizing z
            for(z=1; z<=9; z++){ // ensures maximizing z before y
                if((product = xxx*y*z)== value) 
                    break;
            }
            if(product == value) break;
        }
        if(product == value) break;
    }
    if(y==1) return String.format("%d-%d", xxx, z); // if y is 1, ignore it
    if(z==1) return String.format("%d-%d", xxx, y); // if z is 1 ignore it
    return String.format("%d-%d-%d", xxx,y,z);
}

测试:

public static void main(String[] args) {
    char[] arr1 = {123*4*5};
    System.out.println(transformCharArr(arr1));
    char[] arr2 = {122*2};
    System.out.println(transformCharArr(arr2));
}

输出:

123-4-5
122-2

分析:

时间复杂度:给定循环的O(C)不能运行超过999*9*9,并且考虑到value,总是可以保证在xxx=9 y=9 z=9之前找到999*9*9 = ‭80,919‬ > max(char)=65,535

答案 1 :(得分:0)

您应该知道的第一件事是123 * 4 * 5的意思是2460,所以楼上的点是正确的。

char[] arr = {'1','2','3','*','4','*','5'};
System.out.println(new String(arr).replaceAll("\\*","-"));

答案 2 :(得分:0)

char[] arr = {'1','2','3','*','4','*','5'};
String str = String.valueOf(arr).replace('*', '-');

从char数组中获取一个字符串,并采用replace方法将'*'替换为'-'