扩展:合并两个有序数组
package cglib;
/**
* 写一个函数,把字符串中所有的空格替换为%20 。
* 分析:
* 先遍历一次字符串,得到空格个数,进而得到将空格转换成%20后的串长度 (每个空格替换为%20需要增加2个字符,x个空格增加2x个字符)。
* 然后从后向前依次对空格进行替换,非空格原样拷贝。
* 如果原串有足够大的空间, 则替换过程直接在原串上进行, 因为从后向前替换的过程中,新串用到的空间一定是旧串不需要的空间;
* 如果原串的空间不够大,或是就直接是字符串长度,那么就新开一个串来保存替换后的结果.
*
*
*/
public class StringNumber {
public static String replace(String s) {
if (s == null || s.length() == 0) return s;
final char[] c = s.toCharArray();
int len = c.length;
int count = 0;
for (int i=0;i<len;i++) {
if (c[i]==' ') {
++count;
}
}
//新开一个数组来保存替换后的结果
//每个空格替换为%20后需要增加2个字符,count个空格增加2*count个字符
final char[] d = new char[len+2*count];
int idx=0;
for (int i=0;i<len;i++) {
if (c[i]==' ') {
d[idx]='%';
d[idx+1]='2';
d[idx+2]='0';
idx += 3;
} else {
d[idx]=c[i];
idx++;
}
}
return String.valueOf(d);
}
public static String replace2(String s) {
if (s == null || s.length() == 0) return s;
int len=s.length();
int count = 0;
//统计空格个数
for (int i=0;i<len;i++) {
if (s.charAt(i)==' ') {
++count;
}
}
//将原字符串扩容
for(int i=0;i<2*count;i++){
s=s.concat("\0");
}
//扩容后,原串就会有足够大的空间;替换可直接在原串上进行;
//从后向前依次对空格进行替换,非空格原样拷贝;
//因为从后向前替换的过程中,新串用到的空间一定是旧串不需要的空间
final char[] c = s.toCharArray();
int idx=len-1+2*count;
for (int i=len-1; i>=0; i--) {
if (c[i] == ' ') {
c[idx] = '0';
c[idx-1] = '2';
c[idx-2] = '%';
idx -= 3;
} else {
c[idx] = c[i];
idx--;
}
}
return String.valueOf(c);
}
public static void merge2SortedArray(int[] a , int[] b , int[] c){
//a数组的当前索引
int i = 0;
//b数组的当前索引
int j = 0;
//c数组的当前索引
int k = 0;
//循环,只要a和b都没有遍历完就一直循环
while(i < a.length && j < b.length){
//如果当前a[i]比b[j]小,就把c[k]元素置为a[i],同时k++,i++
if(a[i] < b[j]){
c[k++] = a[i++];
//否则,如果当前a[i]比b[j]大,就把c[k]元素置为b[j],同时k++,j++
}else{
c[k++] = b[j++];
}
}
//上个循环能够结束,说明a已经循环完或b已经循环完
//下述两个循环只能有一个满足循环条件
//只要a没有循环完,就把a中剩下的元素依次放入c中
while(i < a.length){
c[k++] = a[i++];
}
//只要b没有循环完,就把b中剩下的元素依次放入c中
while(j < b.length){
c[k++] = b[j++];
}
}
public static void main(String[] args) {
String s = " i am danielcheng . i am coding ... ";
System.out.println(replace(s));
System.out.println(replace2(s));
System.out.println("合并两数组");
//待合并数组a
int[] a = new int[]{1,3,5,7,9};
//待合并数组b
int[] b = new int[]{2,4,6,8};
//c用来存放合并之后的数组
int[] c = new int[a.length+b.length];
merge2SortedArray(a, b, c);
for(int i = 0;i < c.length;i++){
System.out.print(c[i]+"\t");
}
}
}
输出:%20i%20am%20danielcheng%20.%20%20i%20am%20coding%20...%20
%20i%20am%20danielcheng%20.%20%20i%20am%20coding%20...%20
合并两数组
1 2 3 4 5 6 7 8 9