2道有趣的C++算法题

dfpxsly 2015-06-01 12:34:53
第一题

输入格式:比如 一个记事本中如下分别为 s,k
how_are_you 3
hellow_world 2
输出随意能看见即可


最有一张图上有个小错5 8应该是7 8;
输入格式:记事本中如图中的一个数列

你们有什么好的想法
...全文
67782 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfpxsly 2015-06-02
  • 打赏
  • 举报
回复
谁能教教我第二题第二问
dfpxsly 2015-06-02
  • 打赏
  • 举报
回复
[quote=引用 10 楼 fly_dragon_fly 的回复:]
[quote=引用 11 楼 u012948520 的回复:]
[quote=引用 9 楼 yhlzxq 的回复:]
谢谢各位给的思路 第二题也实现了
白衣如花 2015-06-02
  • 打赏
  • 举报
回复
引用 9 楼 yhlzxq 的回复:
第一题两位摸索出来了;能不能对第二问给些意见呢
如果节点的key是一层一层铺满的,也就是小的数在大数的同一层或者上一层的话 3楼的就可以算边数了 父节点的key比子节点小,共同祖先比两个节点都小。每次找比较大的节点的父节点,每次变数加1 直到两个父节点相同
fly_dragon_fly 2015-06-02
  • 打赏
  • 举报
回复
引用 8 楼 dfpxsly 的回复:
谁能教教我第二题第二问
第一问的父结点没有问题吧, 对这个树作一个层次遍历(即bfs), 这样每个结点得到一个int level[100000], 查询时看谁的level大,就上升到parent,边数加上, 直到有共同的父结点为止
yhlzxq 2015-06-02
  • 打赏
  • 举报
回复
第一题两位摸索出来了;能不能对第二问给些意见呢
dfpxsly 2015-06-01
  • 打赏
  • 举报
回复
我是初学者,最好大神们给出指导时,能最让我学习下代码。望赐教
dfpxsly 2015-06-01
  • 打赏
  • 举报
回复
[quote=引用 2 楼 fly_dragon_fly 的回复:] [quote=引用 3 楼 u012948520 的回复:] [quote=引用 6 楼 zhangxiangDavaid 的回复:] 谢谢楼上的各位,我第一题两位摸索出来了;能不能对第二问给些意见呢
苏叔叔 2015-06-01
  • 打赏
  • 举报
回复
题一:

int main(void)
{
	char s[50];
	int i, j, r, k, n, l, len;
	scanf("%s%d", s, &k);
	len = strlen(s);
	if(0 == len % k) n = strlen(s) / k;
	else n = strlen(s) / k + 1;
	len = n*k + 1;
	char *t = malloc(len);
	l = 0;
	for (i = 0; i < k; i++)
	{
		r = i;
		for (j = 0; j < n; j++)
		{
			if (r >= strlen(s)) t[l] = ' ';
			else t[l] = s[r];
			l++;
			r += 3;
		}
	}
	t[len - 1] = 0;
	for (i = 0; i < len; i++)
		if (' ' != t[i]) printf("%c", t[i]);
	free(t);
	return 0;
}
dfpxsly 2015-06-01
  • 打赏
  • 举报
回复
[quote=引用 2 楼 fly_dragon_fly 的回复:]
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include<string.h>
using namespace std;
int main()
{
ifstream in("data.txt");
string filename;
string line;
int k,n;
char s[1000];
if(in) // 有该文件
{
while (getline (in, line)) // line中不包括每行的换行符
{
cout << line << endl;
n=line.size();
char buf[1000];
strcpy(buf, line.c_str());
k=buf[n-1]-'0';
for(int i=0;i<k;i++)
{
for(int j=i;j<n-1;j+=k) // 输出s[j]
{
cout<<buf[j];
}
}
cout<<endl;
}
}
else // 没有该文件
{
cout <<"no such file" << endl;
system("pause");
}
system("pause");
return 0;
}

这是我的代码,初学者写的不好请指教;
输出
dfpxsly 2015-06-01
  • 打赏
  • 举报
回复
[quote=引用 2 楼 fly_dragon_fly 的回复:] 第一题第一问按您的方法实现了,但是还有一点瑕疵,就是输出结果中那一串串不能有空格,按您的算法会有空格。请问怎么解决
白衣如花 2015-06-01
  • 打赏
  • 举报
回复
第二题,我看左右节点不需要区分,我用的是数组存的 a[i] = j表示i节点的根节点是j
int LineCount(int a, int b)
{
	int count = 0;
	while (a != b)
	{
		if (a < b)
			b = CC[b];
		else
			a = CC[a];
		count++;
	}
	return count;
}
求两个节点之间的边数
fly_dragon_fly 2015-06-01
  • 打赏
  • 举报
回复
一 (1)
 for(int i=0;i<k;i++) for(int j=i;j<|s|;j+=k) // 输出s[j]
(2) 定义 char s[100000], 按刚才倒着放回去就行 二 (1) 定义一个 int parent[100000],读入1 2 时,置 parent[2]=1, 查询直接取parent值 (2) 两结点的共同祖先问题, 自行搜索一下

65,184

社区成员

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

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