社区
C++ 语言
帖子详情
算法问题
laolaoliu2002
2005-04-01 11:07:33
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序
2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间
是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
...全文
396
20
打赏
收藏
算法问题
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序 2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间 是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
照楼主这么说,所编写的程序都要很智能啊。我是做不出来的
程序员
算法
大全
同时,对于面试准备,书中可能会有常见面试题的解析和解题思路,帮助求职者更好地应对面试中的
算法
问题
。 总的来说,这份资料集合是一份宝贵的教育资源,无论你是初学者还是经验丰富的程序员,都可以从中受益。通过...
笔试
算法
26题
这份文档可能包含了26个不同类型的
算法
问题
,涵盖了基础到进阶的各个层次,旨在全面考察求职者的编程思维和
问题
解决能力。 首先,我们要了解的是C语言,这是文档中涉及的主要编程语言。C语言是一种强大的系统级编程...
遗传
算法
和BP人工神经网络
算法
C++实现代码
学习和理解这两种
算法
的C++实现,不仅可以加深对遗传
算法
和神经网络理论的理解,还能提升编程技能,为解决实际
问题
提供强大的工具。在实际应用中,你可以根据具体
问题
调整参数,或者将遗传
算法
和BP神经网络与其他...
C++
算法
大全 PDF
《C++
算法
大全》是一本...通过阅读《C++
算法
大全》,读者不仅可以掌握各种经典
算法
,还能深入了解C++语言的精髓,提高编程技能,为解决实际
问题
提供有力支持。无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。
算法
技术手册 - 中文版
《
算法
技术手册》内容简介:开发健壮的软件需要高效的
算法
,然后程序员们往往直至
问题
发生之时,才会去求助于
算法
。《
算法
技术手册》讲解了许多现有的
算法
,可用于解决各种
问题
。通过阅读它,可以使您学会如何选择和...
C++ 语言
65,189
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章