社区
C++ 语言
帖子详情
算法问题
laolaoliu2002
2005-04-01 11:07:33
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序
2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间
是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
...全文
419
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
打赏
举报
回复
照楼主这么说,所编写的程序都要很智能啊。我是做不出来的
指派
问题
:匈牙利
算法
本文介绍了匈牙利
算法
解决指派
问题
的方法。该
算法
基于指派
问题
标准型,基本思路是将费用矩阵化为有n个不同行不同列零元素的矩阵以得最优解。还阐述了计算步骤,以及求max、人数与工作数不等、一人多事、某人不做某事等衍生
问题
的处理方式。
0022
算法
笔记——【贪心
算法
】背包
问题
,最优装载
问题
本文探讨了背包
问题
中的0-1背包
问题
和一般背包
问题
,通过贪心
算法
解决背包
问题
,强调了贪心选择策略在背包
问题
中的应用。同时介绍了最优装载
问题
,展示了该
问题
同样可以通过贪心
算法
找到最优解。分析了0-1背包
问题
为何不能使用贪心
算法
,并解释了其动态规划解法的原因。
常见的
算法
问题
该博客汇总了常见的
算法
问题
及对应题目,涵盖贪心、分治、搜索、图论等
算法
,还有数学
问题
、数据结构、字符串处理等方面。如贪心
算法
有删数
问题
、背包
问题
;分治
算法
有一元三次方程的解、查找第k大元素等,方便大家交流学习。
指派
问题
算法
本文围绕指派
问题
展开,介绍了其数学模型,指出它是特殊的整数线性规划
问题
。还阐述了二分图的最大匹配、带权二分图的最大匹配与指派
问题
的关系及求解方法。重点讲解了求解指派
问题
的Munkres
算法
,包括
算法
流程、适用情况及与匈牙利
算法
的关系。
【回溯
算法
篇】组合
问题
本文详细介绍了回溯
算法
的概念,通过实例分析了如何使用回溯法解决组合
问题
,包括组合总和系列
问题
,并探讨了剪枝优化策略,以提高
算法
效率。此外,还展示了如何应用回溯
算法
解决电话号码的字母组合
问题
。
C++ 语言
65,211
社区成员
250,516
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章