社区
C++ 语言
帖子详情
算法问题
laolaoliu2002
2005-04-01 11:07:33
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序
2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间
是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
...全文
405
20
打赏
收藏
算法问题
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序 2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间 是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
照楼主这么说,所编写的程序都要很智能啊。我是做不出来的
程序员
算法
大全
同时,对于面试准备,书中可能会有常见面试题的解析和解题思路,帮助求职者更好地应对面试中的
算法
问题
。 总的来说,这份资料集合是一份宝贵的教育资源,无论你是初学者还是经验丰富的程序员,都可以从中受益。通过...
JAVA近百种
算法
大全
这些
算法
涵盖了数据结构、排序、搜索、图论等多个领域,是提升编程技能和解决
问题
能力的重要工具。下面,我们将详细探讨这个资源包中可能包含的一些关键
算法
,并解释它们的基本原理和应用场景。 一、排序
算法
1. ...
C++
算法
大全 PDF
《C++
算法
大全》是一本...通过阅读《C++
算法
大全》,读者不仅可以掌握各种经典
算法
,还能深入了解C++语言的精髓,提高编程技能,为解决实际
问题
提供有力支持。无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。
CSDN论坛-
算法
精华
在IT领域,
算法
是计算机科学的灵魂,它是一系列解决
问题
或执行任务的明确指令。CSDN(China Software Developer Network)论坛作为一个聚集了众多开发者和技术爱好者的平台,提供了丰富的
算法
学习资源。"CSDN论坛-...
Algorithms.
算法
概论.习题答案
文档讨论了不同进制下数的位数转换
问题
,如从十进制转换到二进制。通过计算得出,一个十进制数的位数大约是其二进制表示位数的4倍左右,这有助于理解和估计不同进制下数据存储的空间需求。 ### 知识点六:树结构的...
C++ 语言
65,208
社区成员
250,517
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章