算法问题

laolaoliu2002 2005-04-01 11:07:33
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序
2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间
是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
...全文
394 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamer001 2005-04-02
  • 打赏
  • 举报
回复
学习
du51 2005-04-02
  • 打赏
  • 举报
回复
另外,从本质上说2的确是不可能实现的....
du51 2005-04-02
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
char *rev(char *src)
{
char *b, *e,ch;
b = src;
strrev(src);
while (*b)
{
while (isspace(*b))
++b;
e = b;
while (*e && !isspace(*e))
++e;
ch = *e,*e = '\0';
strrev(b);
b = e,*e = ch;
}
return src;
}
int main()
{
char test[]="blood on your face big disgrace";
cout<<test<<endl;
cout<<rev(test)<<endl;
system("PAUSE");
return 0;
}
这个是C版那位朋友回的.我原班过来的.......是可以的.
-----------------------------------------------------------------------------------------
#include<iostream>
using namespace std;
char* change(char *str)
{
char *p=str,*q=str,*str1,*q1;
int len=strlen(str)-1;
str1=new char[len+2];
//if(!str1)cout<<"ERROR!"<<endl;
while(*p)
{
if(*p!=' ')
{
if(*q==' '||*q==0)
{
q1=q;
do
{
str1[len]=*(--q);
len--;
}while(p!=q);
p=q=q1;
}
else q++;
}
else
{
str1[len]=' ';len--;p++;q++;
}
}
str1[strlen(str)]=*p;
return str1;
}
int main()
{
cout<<"请输入你要转换的字符串!"<<endl;
char str[80];
cin.getline(str,80);
cout<<change(str)<<endl;
system("PAUSE");
return 0;
}
这个是自己做的.很丑.
=====================================================================================
第一题如下.较麻烦.其实可以省一个链表的...
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序
----------------------------------------------------------
#include<iostream>
using namespace std;
struct node{
char *s;
int num;
node *next;
};
node* orderInsertnode(node *&head,node *p) //排序
{
node *p1,*p2;
if(!head) //建头
{
head=p;
p->next=0;
return head;
}
if(head->num>=p->num) //插入头之前
{
p->next=head;
head=p;
return head;
}
p1=p2=head;
while(p2->next&&p2->num<=p->num)
{
p1=p2;p2=p2->next;
}
if(p2->num<=p->num) //插入中间
{
p2->next=p;
p->next=0;
}
else //插入尾.
{
p->next=p2;
p1->next=p;
}
return head;
}
node *Insertnode(node *&head,node *p) //构建链表
{
node *q,*q1;
if(!head) //建头
{
head=p;
p->next=0;
p->num=1;
return head;
}
q1=q=head;
while(q) //处理中间情况
{
if(strcmp(q->s,p->s))
{
q1=q;q=q->next;
}
else
{
q->num+=1;
return head;
}
}
if(!q)q1->next=p; //插入尾部
return head;
}
node *filespik(char *file)
{
char *p=file,*q=p,*q1,e;
node *head=0,*head1=0,*word;
while(*p)
{
while(!isalpha(*p))++p; //指向单词开始处
q1=p;
while(isalpha(*q1)&&*q1)++q1; //指向单词尾处
e=*q1; //留COPY
*q1='\0'; //置结尾符
word=new node;
word->s=new char[strlen(p)+1];
strcpy(word->s,p); //放入单词
word->num=1;
word->next=0;
head=Insertnode(head,word); //插成无序表
word=0;p=q1; *p=e;
} //完成循环后所有单词被无序插入head中.
node *hh=head;
while(hh)
{
word=new node;
word->s=new char[strlen(hh->s)+1];
strcpy(word->s,hh->s);
word->num=hh->num;
word->next=0;
head1=orderInsertnode(head1,word);
hh=hh->next;
} //完成排序
while(head) //回收空间
{
hh=head;
head=hh->next;
delete hh->s;
delete hh;
}
return head1;
}
int main()
{
char test[]="aa aa bb bb bb bb test i love you but do you love me? so big disgrace! good luck";
node *result=filespik(test);
node *p=result;
while(p)
{
cout<<p->s<<" "<<p->num<<endl;
p=p->next;
}
while(result)
{
p=result;
result=result->next;
delete p->s;
delete p;
}
system("PAUSE");
return 0;
}

ycom__net 2005-04-01
  • 打赏
  • 举报
回复
pcboyxhy(-273.15℃)
2 不可能实现


大牛呀!!!!
oldtab 2005-04-01
  • 打赏
  • 举报
回复
2,多有一个字节应该做到。
Latra 2005-04-01
  • 打赏
  • 举报
回复
2,将每个单词压栈,遇到空格为栈顶
zengwujun 2005-04-01
  • 打赏
  • 举报
回复
2.还需要最长单词拥有的存储空间
pcboyxhy 2005-04-01
  • 打赏
  • 举报
回复
2 不可能实现
boyate 2005-04-01
  • 打赏
  • 举报
回复
第二题:

先来个简单的例子吧:
int a = 2;
int b = 3;

a = a + b; //a = 5
b = a - b; //b = 2
a = a - b; //a = 3


char的也一样,只要把+/-操作换成异或操作即可,其他都不需改变的。
怎么做我想就不需要我多废话了吧

char[0]与char[n]交换
char[1]与char[n-1]交换
...
...
循环n/2次就行了
Salam2001 2005-04-01
  • 打赏
  • 举报
回复
婉儿和genty的算法是一样的,不过我还是喜欢婉儿的,简洁明了...除了最后那一堆system() 和 return; 呵呵

有现成库函数不用 --- 浪费呀!
庄鱼 2005-04-01
  • 打赏
  • 举报
回复
char* swap(char *s)
{
int i,j,k,n;
char c;
if(!(*s))return s;
n=0;
while (s[n])n++;
for(i=0,j=n-1;i<j;i++,j--)
c = s[i],s[i]=s[j],s[j]=c;
for(i=0;i<n;i++){
j=i;
while(s[j]!=' '&&j<n)j++;
for(k=j-1;i<k;i++,k--)
c = s[i], s[i]= s[k],s[k]=c;
i = j;
}
return s;
}
snippet_cn 2005-04-01
  • 打赏
  • 举报
回复
szws(克米帅) 的双指针算法并没有在内存中调换单词的顺序,没有达到题目的目的

genty(森火) 的算法不错
*亮点* 2005-04-01
  • 打赏
  • 举报
回复
使用位操作的异或可以做到两个空间的数据交换,见swap函数
caicheng 2005-04-01
  • 打赏
  • 举报
回复
第二题用位运算,似乎可以做到,我见过两个空间交换数据不用中间变量的,记不得了
好像就是genty(森火)说的
*亮点* 2005-04-01
  • 打赏
  • 举报
回复
我来试试
void swap(char *p1, char *p2)
{
*p1 = (*p1) ^ (*p2);
*p2 = (*p1) ^ (*p2);
*p1 = (*p2) ^ (*p1);
}

void inverse(char *data)
{
char *front;
char *tail;

front = data;

while(*(++data) != '\0');

tail = data - 1;
data = front;

while(*front != '\0')
{
while(front < tail)
{
swap(front++, tail--);
}

while((*data == ' ') && (*data != '\0'))
data++;

front = data;

while((*data != ' ') && (*data != '\0'))
data++;

tail = data - 1;
}
}

int main()
{
char buf[] = "your name is laolaoliu2002";

cout << buf << endl;
cout << endl;

inverse(buf);

cout << buf << endl;
}
szws 2005-04-01
  • 打赏
  • 举报
回复
第二题:
法一:(用栈)
void strReve(char *s)
{
char stack[20][20]={0},top=0;
int length=strlen(s);
char string[20]={0};
int i=0,k=0;
while(i<length+1)
{
if(s[i]!=' '&&s[i]!='\0')
string[k++]=s[i];

else
{
string[k]='\0';
strcpy(stack[top++],string);
k=0;
memset(string,0,20);
}
i++;
}
while(top>=0)
{
cout<<stack[top]<<' ';
top--;
}
}

法二:(双指针)
void fun(char *s)

{
char *a,*t,*y;
t=s;
while(*t++);
a=t-1;
while(t-s>-1)
{
if(*t==' '||t-s==0)
{
y=t-s?t+1:t;
while(a-y)printf("%c",*y++);
if(t-s)printf(" ");
a=t;
}
t--;
}
}

dudu妈 2005-04-01
  • 打赏
  • 举报
回复
#include <iostream>
#include <stdlib.h>
#include <cstdlib>
using namespace std;

int main(int argc, char *argv[])
{
char str[] = "my name is laolaoliu2002";
cout<<str<<endl;
char *p = strrev(str);
while(*p != 0)
{
char *q = NULL;
q = strstr(p," ");
if(q != NULL)
{
*q = 0;
strrev(p);
*q = ' ';
p = q + 1;
}
else
{
strrev(p);
break;
}

}
cout<< str <<endl;

system("PAUSE");
return EXIT_SUCCESS;
system("PAUSE");
return 0;
}
h770 2005-04-01
  • 打赏
  • 举报
回复
只说了不要用多余的数组,但没有说不能用变量,呵呵
dudu妈 2005-04-01
  • 打赏
  • 举报
回复
哦仔细想想也可以实现,等会做出来给你发
dudu妈 2005-04-01
  • 打赏
  • 举报
回复
照楼主这么说,所编写的程序都要很智能啊。我是做不出来的

64,678

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧