社区
C++ 语言
帖子详情
算法问题
laolaoliu2002
2005-04-01 11:07:33
1、有一篇文章存储在数组中统计出现的单词并按照出现次数排序
2、将一个存储在数组中的英文句子的单词倒排例如“my name is laolaoliu2002"变成”laolaoliu2002 is name my“不要使用额外的数组存储空间
是一个朋友的问题由于我最近比较忙(要出差)没有时间写了。
...全文
394
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
打赏
举报
回复
照楼主这么说,所编写的程序都要很智能啊。我是做不出来的
算法
技术手册 - 中文版
《
算法
技术手册》内容简介:开发健壮的软件需要高效的
算法
,然后程序员们往往直至
问题
发生之时,才会去求助于
算法
。《
算法
技术手册》讲解了许多现有的
算法
,可用于解决各种
问题
。通过阅读它,可以使您学会如何选择和实现正确的
算法
,来达成自己的目标。另外,书中的数学深浅适中,足够使您可以了解并分析
算法
的性能。 较之理论而言,《
算法
技术手册》更专注于应用。《
算法
技术手册》提供了高效的代码解决方案,使用多种语言进行编写,让您可以轻松地将其应用于特定的工程当中。通过《
算法
技术手册》,您可以: · 解决特定代码的
问题
,或者提升既有解决方案的性能 · 快速找到与您所解决的
问题
相关的
算法
,并决定哪个
算法
才是最适合的那一个 · 探索使用C、C++、Java以及Ruby实现的
算法
解决方案以及开发小贴士 · 了解
算法
预期的性能,以及它达到最高性能时所需要的条件 · 发现不同
算法
之间相似的设计哲学 · 学习高级数据结构,来提升
算法
的性能 通过《
算法
技术手册》,您能学到如何提升
算法
的性能,这将是您的软件应用程序走向成功的关键。
解决
算法
问题
的五种通用方法
毫无疑问,解决
算法
问题
一定不止5种方法,但是下面的五种方法可能更加有用。但是还是要记住,
算法
靠的是不停的练习,练习越多,很多
问题
就迎刃而解! 同样也必须记住,这五种方法不是单独的组成,它们可以混合在一起使用。也就是说,可能某一个
算法
的解决方法同时使用了下面两种方法。 方法一:举例法 描述:列举
问题
的例子,然后看看自己能不能计算出一个通用的答案
程序员必备
算法
课!(揭秘淘宝购物车
算法
)
双十一,双十二,你是否也在购物车中放置了很多商品?当面对购物车中不同商家、不同价格、不同质量和服务的商品时,如何在有限的预算下,选择到让你最满意的商品,本次公开课主要从以下几方面进行讲解:首先讲解如何将购物车选择商品
问题
转进行量化指标度量,转化为计算机可以求解的
算法
问题
;其次结合实例讲解实际
问题
如何利用
算法
求解;最后基于Python语言如何设计
算法
并在计算机上进行实现。
五分钟带你了解哈希
算法
究竟是什么!
大家好呀,我是你们的贝尔同学。经过一段时间的认知学习,大家应该对数字货币有了一定的了解。今天呢,我们要讲一些比较深的内容,比如比特币的哈希
算法
问题
。熟悉区块链的朋友首先想到的肯定就是比特币挖矿,比特币挖矿就是不断修改区块头部的随机数,然后计算区块的哈希值,知道这个哈希值满足特定标准的过程,那么哈希
算法
到底是什么?什么是哈希
算法
?哈希
算法
又叫散列
算法
,是将任意长度的二进制值映射为较短的固定长度的二进...
经典
算法
问题
——稳定匹配(Stable Matching)
经典
算法
问题
——稳定匹配(Stable Matching)
问题
起源 在1962年,经济学家 David Gale 和 Lloyd Shapley 提出:能否设计一个高校录取过程,能够自我执行(self-enforcing)形成一个最佳的匹配效果。
算法
的 C++ 实现代码请移步 Github:https://github.com/hotelll/CS222Note/tree/master/StableMatching 简易
问题
问题
描述 给出一个 nnn 个男性的集合 MMM 和 nnn 个女性的集
C++ 语言
64,678
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章