替换字符--《剑指offer》

题目描述:给定一个字符数组,将其中的某一字符替换为其他几个字符;如we are tf将空格替换为%20,结果为we%20are%20tf(字符数组后有足够位置)


分析:如果从前往后替换则一些字符会多次移动浪费时间,如果能一次将其放入位置一定会减少资源利用的


思路:遍历一遍算出每个字符要移动到的位置,以便一次移动到目标位置


实现:

public static void replaceBlack(char s[]){
int i=0,length=0,count=0;
while(s[i]!='\0'){
if(s[i]==' '){
count++;
}
length++;
i++;

}
if(s==null||length==0)
return;
int last=count*2+length-1,pre=length-1;
while(pre!=last){
if(s[pre]!=' '){
s[last]=s[pre];
last--;
pre--;
}
else{
s[last--]='0';
s[last--]='2';
s[last--]='%';
pre--;
}
}
}


主调函数:

public static void main(String[] args) {
// TODO Auto-generated method stub
char[] s=new char[100];
s[0]='w';
s[1]='e';
s[2]=' ';
s[3]='a';
s[4]='r';
s[5]='e';
s[6]=' ';
s[7]='w';
s[8]='t';
s[9]='\0';
replaceBlack(s);
System.out.println(s);

}

结果:we%20are%20wt


相似案例:合并有序数组AB,结果放在A后面

实现:

public static void merge(int a[],int b[]){
int al=0,bl=0;
int i=0,last,prea,preb;
if(a==null||b==null)
return;
while(a[i]!='\0'){
al++;
i++;
}
i=0;
while(b[i]!='\0'){
bl++;
i++;
}
last=al+bl-1;
prea=al-1;
preb=bl-1;
if(prea==0||preb==0)
return;
while(prea>=0&&preb>=0){
if(a[prea]>b[preb]){
a[last]=a[prea];
last--;
prea--;
}
else{
a[last]=b[preb];
last--;
preb--;
}
}
while(preb>=0){
a[last]=b[preb];
preb--;
}
}


主调函数:

public static void main(String[] args) {
// TODO Auto-generated method stub
int [] a=new int[100];
int [] b=new int[100];
a[0]=1;
a[1]=3;
a[2]=5;
a[3]='\0';
b[0]=2;
b[1]=4;
b[2]=4;
b[3]=9;
b[4]='\0';
merge(a, b);
for(int k=0;k<10;k++){
System.out.print(a[k]);
}
}

结果:1234459000


总结:遇到案例后如果有多次执行一个操作后到目标状态,应该想想是否可以一次可以到达目标状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值