刷题_day2_vv

来源:互联网 发布:珠海远光软件 编辑:程序博客网 时间:2024/06/05 16:12
package com.vv;


/**
 * 题目1描述:实现一个函数,把字符串中的所有空格换成%20 
 * 题目2描述:实现一个函数,把只含有*和数字的字符数组进行重排,所有数字放在最右边,*在最左边。
 * 
 * 思路分析:
 * 主要是从右到左倒着复制的技巧
 * 第二题,把原字符数组也当做要复制的新数组,其实是原地复制。
 * 
 * @author vv 2016.4.6
 *
 */
public class day2 {


public static void main(String[] args) {


String s = " we are happy  !";
char[] a = s.toCharArray();
// 构造足够大的字符数组,左半区为原字符数组元素,右半区全空。
char[] b = new char[100];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
// 空格替换
replace(b);
System.out.println(b);


// 字符串重排
String c = "12345";
char[] d = c.toCharArray();


modify(d);
System.out.println(d);


}


// 字符串替换
public static void replace(char[] chas) {


if (chas == null || chas.length == 0) {
return;
}


// 第一步:一次遍历,记录左半区字符总数,和空格数
int num = 0;
int len = 0;
for (len = 0; len < chas.length && chas[len] != 0; len++) {// 如果没有空格,防止越界
if (chas[len] == ' ') {
num++;
}
}


// 第二步:计算新长度最末元素位置
int newLen = len + num * 2 - 1;


// 第三步:从左半区的最后一个字符开始倒着遍历,同时复制到新长度最后的位置,并依次倒着复制
for (int i = len - 1; i > -1; i--) {
if (chas[i] != ' ') {
chas[newLen--] = chas[i];
} else {
chas[newLen--] = '0';
chas[newLen--] = '2';
chas[newLen--] = '%';
}
}
}


// 字符串重排
public static void modify(char[] chas) {


if (chas == null || chas.length == 0) {
return;
}


int t = chas.length - 1;
for (int i = t; i > -1; i--) {
if (chas[i] != '*') {
chas[t--] = chas[i];
}
}
for (; t > -1;) {
chas[t--] = '*';
}
}
}
0 0