经典编程题——折纸问题

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;
}

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

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

经典编程题——折纸问题

一道经典面试题:字符串在Java中如何通过“引用”传递

幻翼鸟折纸机器人鱼缸数独编程积木,加入会员还可返现

经典Java面试题及答案解析

100+经典Java面试题及答案解析

100+经典Java面试题及答案解析