`
CalvinMnakor
  • 浏览: 52096 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于全序列的一些

阅读更多
闲话少说,直接看题:
算法程序题: 写道

该公司笔试题就1个,要求在10分钟内作完。
题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
 

      你可以把它看做是图结构的遍历问题,实际上就是六个点连成一个无向连通图,然后对每个节点分别进行遍历,得到的结构就是我们所要的结果,当然还要去除一些不符序列。
      其实你没必要非得把它复杂化,给他打上高深的阴影。其实使用递归即可很容易的得到,这也是函数式编程中最基本、最完美的地方,我们不去改变事物的状态,只是用函数去做我们所需的过程,然后得到我们所需的结果,它是一个闭包的运算。
一个相当简单的全序列产生函数:
void Perm(int *list, int begin, int end)
{
	//change the list[begin:end]
	if(begin == end){	//all sorted
		for(int i = 0;  i <= end; i++)
			cout<<list[i]<<" ";
		cout<<endl;
	}else
	{
		for(int i = begin; i <= end; i++)
		{
			swap(list[begin],list[i]);
			Perm(list,begin+1,end);
			swap(list[begin],list[i]);
		}
	}
}
 很容易理解,用begin来标记剩余序列的开始,同时标记当前的递归深度。
考虑到一些限制条件,我们可以在当前的递归深度时,加一个filter进行裁剪,将不符的序列裁去。
1、4不不在第三位,删除所有。
2、3和5不在一起,删除两种情况。
3、2和2不重复,删除一种情况,此处特殊采用置换法,将一个2换为6,只保留“2在6后”一种情况。
相应的过滤器和改进的perm函数如下:
/* filter  */
int err(int *list,int begin)
{
	/* Test one
	if(begin == 2 && list[begin] == 3){
		return 1;
	}*/

	if(begin == 2 && list[begin] == 4){	//4 cannot be in list[2]
		return 1;
	}
	if(begin > 0 && 
		(list[begin-1] == 3 && list[begin] == 5||
		list[begin-1] == 5 && list[begin] == 3)){//3 and 5 cannot be together
		return 1;
	}
	if(begin > 0 &&
		list[begin] == 6 && exist(list,2,begin-1)){//two 2 here
		return 1;
	}

	return 0;
}

void Perm(int *list, int begin, int end)
{
	//change the list[begin:end]
	if(begin == end){	//all sorted
		if(err(list,begin)) return;
		for(int i = 0;  i <= end; i++)
			if(list[i] == 6) cout<<2<<" ";
			else cout<<list[i]<<" ";
		cout<<endl;
	}else
	{
		for(int i = begin;i <= end; i++)
		{
			swap(list[begin],list[i]);
			if(err(list,begin)) continue;
			Perm(list,begin+1,end);
			swap(list[begin],list[i]);
		}
	}
}
 最近在研究分布式数据存储的相关问题,写blog的时间可能会少些,但还是坚持一周能写上一篇。
分享到:
评论

相关推荐

    一些关于时间序列的资料

    以下是一些关于时间序列的关键知识点: 1. **定义**:时间序列是由一系列按特定时间顺序排列的数据点构成的序列,每个数据点对应一个时间戳。 2. **基本特征**:时间序列数据通常具有趋势(Trend)、季节性...

    m序列与Gold序列比较.pdf

    - **生成方法**:相对于m序列,Gold序列的生成稍微复杂一些,需要通过两个m序列进行组合。 #### 四、性能比较 m序列和Gold序列在扩频通信中的应用有着各自的优点和限制,具体如下: 1. **自相关和互相关**: - m...

    序列帧合并器 max序列帧.zip

    5. **多行设置**:一些高级的序列帧合并器允许用户不仅仅局限于单行合并,而是可以设置多行排列,这对于处理宽高比不一的序列帧或者需要特定布局的项目非常有用。 6. **自动裁剪PNG图片**:自动裁剪功能能够帮助...

    java 对象的序列化与反序列化

    下面是一些关于序列化的重要知识点: 1. **序列化标识符(SerialVersionUID)**:Java允许你为每个可序列化的类定义一个唯一的`serialVersionUID`,默认是由JVM根据类的结构计算出来的。如果类的版本更新导致结构变化...

    ZEMAX中如何将序列透镜转为非序列组件

    - 可能需要手动调整一些参数,比如表面类型、材质属性等,以适应非序列模式的要求。 #### 步骤5:优化非序列组件 - 完成转换后,可以在非序列模式下对组件进行进一步优化。利用非序列模式提供的强大工具,如自由...

    XML序列化与反序列化 实战

    这个类可能包含了一些方法,如`Serialize`(将对象序列化为XML字符串或写入XML文件)和`Deserialize`(从XML字符串或文件反序列化回对象)。 接下来,`说明.txt`文件应该提供了关于如何使用这个项目的详细指南。它...

    UML 序列图 UML 序列图

    "UML 序列图" UML 序列图是一种重要的建模工具,主要用于描述对象之间的交互行为。...UML 序列图是一种非常有用的建模工具,能够帮助开发者和业务人员更好地理解系统的行为,定义事件序列,产生一些希望的输出。

    ASPNET中JSON的序列化和反序列化的方法

    ***还提供了其他一些工具来处理JSON,例如`JavaScriptSerializer`,它位于`System.Web.Script.Serialization`命名空间下,需要引用`System.Web.Extensions.dll`。另外,第三方库如***(现在叫Newtonsoft.Json)也...

    序列化和反序列化dll文件和proto

    在实际应用中,DLL文件的序列化和反序列化可能会遇到一些挑战,例如版本兼容性、数据安全性和性能优化。而Proto的优势在于其紧凑的二进制格式和跨语言支持,使得它成为网络通信和数据存储的理想选择,特别是在大数据...

    序列图合成器

    而"Lib"可能包含了一些库文件或支持文件,它们是程序运行所必需的,确保了工具的正常功能。 总的来说,序列图合成器是一款实用且高效的工具,对于小游戏的开发者来说,它可以简化动画资源的管理和优化,提升游戏...

    java序列化(Serializable)的作用和反序列化.doc

    2. **元数据的保存**:除了实例变量的状态外,序列化还会记录一些元数据,如对象所属的类名、版本号等,以便在反序列化时能够重建原始对象。 3. **序列化为字节流**:序列化过程中会将对象的状态和元数据转化为字节...

    hashtable序列化与反序列化

    然而,需要注意的是,序列化和反序列化可能会遇到一些问题。比如,如果你在序列化后修改了类的结构(添加或移除字段),那么在反序列化时可能会遇到`InvalidClassException`。此外,序列化可能会暴露敏感数据,因此...

    delphi序列化与反序列化

    Delphi社区提供了一些第三方库,如SuperObject(用于JSON序列化)和Indy(支持多种协议的网络通信,包括序列化)。这些库提供了更高级的序列化功能,可以处理复杂的数据结构和自定义类型,同时支持多种数据格式。 ...

    C# 后台序列化Json序列、反序列化Json序列(三种方法)

    其API设计与Json.NET类似,但需要注意一些差异。 - **序列化**: 使用`JsonSerializer.Serialize()`,例如: ```csharp var options = new JsonSerializerOptions(); string jsonString = JsonSerializer....

    lorenz_Lorenz序列_lorenz时间序列_yetzfu_时间序列_

    - `fun_lorenz - 副本.m` 和 `fun_lorenz - 副本 (2).m`: 这两个可能是原始函数的备份或修改版本,可能包含了一些不同的参数设置或额外的分析功能。 在分析Lorenz序列时,常见的任务包括绘制轨迹图(3D图)、计算...

    数学建模实例DNA序列分类

    例如,在全序列中有一些是用于编码蛋白质的序列片段,即由这4个字符组成的64种不同的3字符串,其中大多数用于编码构成蛋白质的20种氨基酸。又例如,在不用于编码蛋白质的序列片段中,A和T的含量特别多些,于是以某些...

    m序列产生及特性实验

    反馈逻辑通常通过一些特定的寄存器输出进行异或(XOR)操作来实现。反馈系数即指定了哪些寄存器的输出会被用于反馈。在n级LFSR中,有n个反馈系数,通常用八进制或二进制来表示。只有特定的反馈系数组合才能产生周期...

    Java序列化_Java序列化结构_

    然而,Java序列化也存在一些潜在的问题和不足: 1. **安全性**:序列化可能会暴露敏感数据,因为所有字段(除非被`transient`或`static`修饰)都将被序列化。攻击者可以通过操纵序列化流来执行恶意代码,因此在处理...

    时间序列分析课后题答案 王振龙 pdf

    对于无法直接识别的部分内容,可以推测其可能是一些时间序列数据的输出结果、模型的参数估计、或者是时间序列分析的图示数据,比如自相关函数(ACF)和偏自相关函数(PACF)图等,这些在确定模型的阶数和类型时会起...

    VVC中一些4K序列

    VVC一些比较难找的4K测试序列:FoodMarket,后续会继续更新,部分4K序列压缩后太大,没法上传,有需要的私信就可以

Global site tag (gtag.js) - Google Analytics