经典编程题——折纸问题

Posted wtxuebc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典编程题——折纸问题相关的知识,希望对你有一定的参考价值。

眼过千遍不如coding一遍,简单记录一下笔试题

题目描述:

请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up"。

分析及测试用例

假如沿着上往下折,所以折痕从下往上数依次为:
1:“down”
2:“down”,“down”,“up”
3:“down”,“down”,“up”,“down”,“down”,“up”,“up”
因为从上往下折,每次折的时候,中间折痕是down
每次折都是在往相反的方向复刻上一折的折痕

思路:

因为要求输出字符串数组,所以操作不好操作,可以先基于1,-1操作,最后在遍历一遍相应的替换即可;
每次中间 “down” 的位置依次为2的n次方
数组的第一个位置为1(down),从第二次开始,每次与2的n次方与左边值等距离的右边值为左边值得相反数,递归求解即可

coding

void getFold(int index,int n,vector<int> vec)  //先得到int数组得目的就是整数还有个取反操作

	if (n >= 1)
	
		vec[index] = 1;   //每次折痕的位置都为1(down)
		int newindex = 2 * index + 1;  //下一次折纸得位置
		for (int i = 0;i<index;i++)
		
			vec[index + i] = vec[index - i];  //折纸两侧的折痕相反
		
		getFold(newindex, n - 1, vec);
	

long long getnum(int n)   //折n次得多少折痕

	long long x = 1;
	while (n--)
	
		x *= 2;
	
	return x-1;

vector<string> foldPaper(int n)  //遍历int数组,得到string数组

	int sum = static_cast<int>(getnum(n));
	vector<int> vec(sum);
	vector<string> vecstr(sum);
	getFold(0, n, vec);
	for (auto&x:vec)
	
		if (x == 1)
		
			vecstr.emplace_back("down");
		
		else
		
			vecstr.emplace_back("up");
		
	
	return vecstr;

其他解法:

void esayFinds(int n,bool isdown,vector<string> &vec)

	if (n == 0)  return;
	esayFinds(n - 1, true,vec);
	if (isdown)
	
		vec.emplace_back("down");
	
	else
	
		vec.emplace_back("up");
	
	esayFinds(n - 1,false, vec);


vector<string> foldPaper(int n) 

	vector<string> vec;
	esayFinds(n, true,vec);
	return vec;

朋友们可以评论一下这是什么思路得解法

以上是关于经典编程题——折纸问题的主要内容,如果未能解决你的问题,请参考以下文章

经典编程题——折纸问题

折纸问题

算法21:折纸问题

折纸运算

纸条折痕问题

题解折纸