当给出输入字符串时,我想把它分成两组
有了这两组,我想创建一个新的交替字符串。
例如
abc1234defgh567jk89
将转变为
a1b2c3d5e6f7j8k9
注意数字4,g,h已被丢弃。
我认为在这种情况下可以实现队列。
队列1> ABC
队列2> 123个
索引0到2是一个字符
index 3是一个int,所以对于队列2,我们只接受3个值。
我的问题是有更高效的数据结构来执行此操作吗? 在实现过程中,如何比较以查看特定值是int还是char?
请指教。
答案 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")
}
}
关于数据结构,我个人将使用两个单链表,一个用于字符,一个用于数字,每个字符将存储在不同的节点中。 为什么?,如果您将这些字符(一般来说,我的意思是字符和整数)存储在三组中,您将不得不添加更多代码来拆分这些组并将字符和整数放在一起,它们在链表中是有道理的,因为
要生成输出: 有两个数据结构,你可以添加另一个检查:
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"));
}