黑马程序员技术交流社区
标题:
字符移动
[打印本页]
作者:
薛旻
时间:
2014-3-3 17:25
标题:
字符移动
编码完成下面的处理函数。函数将字符串中的字符“*”移动到串的前部分,前面的非“*”字符后移,但不能改变非“*”字符的先后顺序,函数返回串中字符“*”的数量。如原始串为:ab**cd**e**12,处理后为******abcde12,且函数返回值为5(要求使用尽量少的时间和辅助空间)
贴出自己程序的运行时间。
作者:
e.c
时间:
2014-3-3 19:35
获取长度len1,删除所有*
获取长度len2,在开始位置添加*
返回len2-len1
作者:
Amorvos
时间:
2014-3-3 22:44
楼主我给你写了一个,你看看是不是你要的,你可以自己再改一下
public class Number {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("ab**cd**e**12");
StringBuilder key = new StringBuilder(sb.length());
int num = 0;
for (int i = 0; i < sb.length(); i++) {
if ('*' != sb.charAt(i)) {
key.append(sb.charAt(i));
} else {
num++;
}
}
key = key.reverse();
for (int i = 0; i < num; i++) {
key.append('*');
}
System.out.println(key.reverse());
System.out.println(num);
}
}
复制代码
作者:
syw02014
时间:
2014-3-4 09:02
给你四种方法:第一种:
#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;
void swap_star(char& a, char& b){
char t;
t = a;
a = b;
b = t;
}
int main()
{
char star[] = "ab**cd**e*12";
cout << " star : " << star << endl;
int sz = sizeof(star);
int starpos = sz - 2;
int nonstar = sz - 2;
int cnt = 0;
while(starpos >= 0 && nonstar >= 0){
while(star[starpos] != '*' && starpos > 0){ //从末位开始查找‘*’的索引
--starpos;
}
if(starpos > 0){ // 计算非‘*’字符的起始索引,与‘*’一样,倒序搜索,因为要求不改变原非‘*’字符的顺序
if(starpos > nonstar){
nonstar = nonstar - 1;
}else{
nonstar = starpos - 1;
}
}else{ // 如果‘*’索引到了 0, 则说明已交换顺序完毕
break;
}
while(star[nonstar] == '*' && nonstar > 0){ // 找到待交换非‘*’字符索引
--nonstar;
}
if(star[nonstar] != '*' && nonstar >= 0){
swap_star(star[starpos],star[nonstar]);
starpos = starpos - 1;
}else{
cnt = starpos + 1; // 交换完毕,‘*’字符的索引是从0开始的最后一个‘*’字符的索引
break;
}
}
cout << "finally : " << star << " star number : " << cnt << endl;
return 0;
}
复制代码
第二种:
#include <iostream>
using namespace std;
void movStar(char* p)
{
int len = strlen(p);
int i;
for (i = len-1; p[i]!='*';i--); //从后向前找到第一个'*',然后开始覆盖。
int j = i;
for (;i >= 0; i--)
{
if (p[i]!='*')
{
p[j--]=p[i];
}
}
while(j>=0)
{
p[j--]='*';
}
}
int main()
{
char p[]="ab**cd**e*12";
cout<<p<<endl;
movStar(p);
cout<<p<<endl;
}
复制代码
第三种:
#include <iostream>
using namespace std;
void swap(char* p, char* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
int movStar(char* p, int n)
{
char* q1 = p+n-1, *q2 = p+n-1;
while (q1 > p)
{
while (*q2 != '*')
q2--;
q1 = q2-1;
while (*q1 == '*')
q1--;
swap(q1, q2);
cout<<p<<endl;
}
return q2-q1+1;
}
int main()
{
char p[]="ab**cd**e*12";
int cnt = movStar(p,strlen(p));
cout<<"after movStar..."<<endl;
cout<<"number of * is: "<<cnt<<endl;
cout<<p<<endl;
}
复制代码
第四种:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char* str,int i,int j)
{
if(str[i] != str[j])
{
str[i]^=str[j];
str[j]^=str[i];
str[i]^=str[j];
}
}
int departStars(char *str)
{
//k停留在其它字母上
int len,i,k,cout=0;
if(str==NULL) return 0;
if((len=strlen(str)) < 1) return 0;
i=k=len-1;
while(i>=0)
{
if(str[i]!='*')
{
swap(str,i--,k--);
}
else
{
--i;
++cout;
}
}
return cout;
}
int main(void) {
char str[]="*ABCD*D*BSD**d**";
printf("%d %s",departStars(str),str);
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2