交替的char和int字符串

时间:2013-11-22 04:08:45

标签: java string

当给出输入字符串时,我想把它分成两组

  1. char
  2. int值。
  3. 有了这两组,我想创建一个新的交替字符串。

    例如

    abc1234defgh567jk89
    

    将转变为

    a1b2c3d5e6f7j8k9
    

    注意数字4,g,h已被丢弃。

    我认为在这种情况下可以实现队列。

    队列1> ABC
    队列2> 123个
    索引0到2是一个字符 index 3是一个int,所以对于队列2,我们只接受3个值。

    我的问题是有更高效的数据结构来执行此操作吗? 在实现过程中,如何比较以查看特定值是int还是char?

    请指教。

4 个答案:

答案 0 :(得分:1)

将字符串作为char整数数组处理会使这更容易比较,因为您可以对条目进行简单的比较。如果array [x]> 64,那么它是一个字符,它就是一个数字。您可以使用两个指针来进行交错。一个用于字符,另一个用于整数。找到一个字符然后前进整数指针,直到找到匹配为止,然后只要它们都是真的就前进,然后快进它们。例如:

char array[]=(char *)string;

int letter=array[0];
int number=array[0];


// Initialize
while(number >= 64)
    number++;
while (letter<64)
    letter++;

//Now that the pointers are initialized, interleave them.

while(letter>=64 && number<64)
{
       output[i++]=letter;
       output[i++]=number;
    number++;
    letter++;
}

// Now you need to advance to the next batch, so you need to see the comparison false and then true again.

...

答案 1 :(得分:1)

你是对的,队列是解决这个问题的一个很好的数据结构。但是,如果你想要更好的方法,Linked List将是另一个非常相似的选择。

要检查特定值是字母还是数字,可以使用Character类。例如,

String sample = "hello1";

Character.isLetter( sample.charAt(0) ); // returns true
Character.isLetter( sample.charAt(5) ); // returns false

答案 2 :(得分:1)

  

如何比较以查看特定值是int还是char?

您可以这样做:

String string = "abc1234defgh567jk89";
for(int i=0; i<string.length;i++){
    int c = (int)string.charAt(i);
    boolean isChar = 97<=c&&c<=122 || 65<=c&&c<=90;
    boolean isNum = 48<=c&&c<=57;
    if(!isChar && !isNum){
        throw new IllegalArgumentException("I don't know what you are")
    }
}

关于数据结构,我个人将使用两个单链表,一个用于字符,一个用于数字,每个字符将存储在不同的节点中。 为什么?,如果您将这些字符(一般来说,我的意思是字符和整数)存储在三组中,您将不得不添加更多代码来拆分这些组并将字符和整数放在一起,它们在链表中是有道理的,因为

  1. 你可以根据需要放置尽可能多的节点(或者内存允许你,但让我们假设是无限的)
  2. 数据将按顺序存储(看起来像是为了显示输出而需要的某种要求,这也会丢弃树和堆栈(FILO))
  3. 因为您只需要在生成输出时继续前进,所以双链表将过度工程化。
  4. 要生成输出: 有两个数据结构,你可以添加另一个检查:

    if(listChars.size() != listNums.size()){
        throw new IllegalArgumentException("Wrong input!!!")
    }
    

    此外, 查看列表将花费O(n)时间,使用的内存将为O(n),查看这两个列表将带您O(n/m),其中m是初始字符组的大小。 你可以这样做:

    Iterator<Character> iterChar = listChar.iterator();
    Iterator<Integer> iterNum = listChar.iterator();
    String result = "";
    while(iterChar.hasNext() && iterNum.hasNext() ){
        result+=iterChar.next()+iterNum.next();
    }
    

    最后,你可以在这里使用队列或链表,在这个场景中都给你相同的

答案 3 :(得分:1)

要检查下一个字母是否是字母或数字,您可以使用此字符:

public static boolean isNumber(char c) { return c >= '0' && c <= '9'; }
public static boolean isLetter(char c) { return c >= 'a' && c <= 'z'; }

这些函数从pos i开始查找下一个数字或字母的索引:

public static int nextNumber(String s, int i) {
    while(i < s.length() && !isNumber(s.charAt(i))) i++;
    return i;
}

public static int nextLetter(String s, int i) { 
    while(i < s.length() && !isLetter(s.charAt(i))) i++;
    return i;
}

你真的不需要数据结构,你只需要3个指针:

public static String alternate(String s){
    // pointers
    int start = 0, mid = 0, end = 0;

    StringBuilder sb = new StringBuilder(s.length());
    while(end < s.length()){
        // E.g. for 'abc1234' {start, mid, end} = {0, 3, 7}
        start = Math.min(nextLetter(s, end), nextNumber(s, end));
        mid =   Math.max(nextLetter(s, end), nextNumber(s, end));
        end =   Math.max(nextLetter(s, mid), nextNumber(s, mid));

        for(int i = 0; i < Math.min(mid - start, end - mid); i++)
            sb.append(s.charAt(start + i)).append(s.charAt(mid + i));
    }
    return sb.toString();
}

运行以下示例会输出所需的结果:a1b2c3d5e6f7j8k9

public static void main(String... args){
    System.out.println(alternate("abc1234defgh567jk89"));
}