c# - 简单集合的有序交换

标签 c# algorithm .net-3.5

我有一个交换两个项目的方法:

swap( collection['a'], collection['b'] );  // result = 'b', 'a'
swap( collection[0], collection[1] ); // result = collection[1], collection[0]
swap( 0, collection.indexOf(collection[1]) ); // result collection[1] index, 0
  • 不能修改交换方法。
  • 存储在集合中的四个可能值:'a'、'b'、'c'、'd'
  • 交换为始终按“d”、“b”、“a”、“c”的顺序
  • 四个可能值中的任何一个可能在也可能不在集合中

请帮我实现这个算法。

谢谢!

对于那些关心的人,这不是家庭作业。

示例:

//Example 1:
//collection contains: 'a', 'b', 'c', 'd'
//desired order: 'd', 'b', 'a', 'c'
swap(0, collection.IndexOf(collection['d']));
swap(1, collection.IndexOf(collection['b']));
swap(2, collection.IndexOf(collection['a']));
swap(3, collection.IndexOf(collection['c']));

//Example 2:
//collection contains: 'a', 'b', 'c'
//desired order: 'b', 'a', 'c' 
swap(0, collection.IndexOf(collection['b']));
swap(1, collection.IndexOf(collection['a']));
swap(2, collection.IndexOf(collection['c']));

最佳答案

基本上,您正在寻找一种具有间接比较的排序。也就是说,您不是比较字母本身,而是比较它们在表格中查找的值。如果您原谅 C++ 语法,一般的想法是这样的:

class my_cmp { 
    static const int positions[] = { 2, 1, 3, 0};
public:
    bool operator<(char a, char b) { 
        return positions[a-'a'] < positions[b-'a'];
    }
}:

std::sort(collection.begin(), collection.end(), my_cmp());

std::sort 将使用 swap 来移动集合中的元素。尽管语法明显与我上次使用时内存中的有所不同,但相同的总体思想也应该相当适用于 C#。

关于c# - 简单集合的有序交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3875615/

相关文章:

algorithm - 寻找更好的压缩技术

c# - 从 XmlReader 的字符串中删除\"转义字符

c - 从数组中选择最大子数组

c# - 检查图中所有节点之间的距离是否 <=k

wpf - Application.LoadComponent 使应用程序在关闭时卡住

c# - 如何在 asp.net 中呈现之前删除 html 注释标记

xml - .NET 3.5 XPath 类和方法是否与 XSLT 2.0 兼容?

c# - 当 DLL 位于不同目录时如何添加项目引用

c# - inetsvr 的 appcmd 在发出后发出错误

c# - 向网站发送新的数据库记录