- 浏览: 1654582 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
上次gx同学问我一道又重复数字的全排列的问题,我当时用set保存,然后直接回溯。这这种做法,效率比较低,没有去剪枝,从而像1,1,1,1,1这样的序列都需要回溯很多次。今天写了一个剪枝的。
c++ STL algorithm中有next_permutation可以直接调用,ACM的时候经常偷懒用这个,呵呵。
学以致用:poj 1731
http://acm.pku.edu.cn/JudgeOnline/problem?id=1731
poj1256 http://acm.pku.edu.cn/JudgeOnline/problem?id=1256
这道题需要一种特殊的数序输出:
An upper case letter goes before the corresponding lower case letter.
So the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'.
我们只需要定义一个正确的比较函数就可以了
或者
这样我们的代码就出来了:
我们还是用STL来爽爽这道题吧:
public class Permutation { private int[] a; public Permutation(int[] a) { this.a = a; } public boolean isOk(int b,int e){//判断是否重复 if(b < e){ for(int i = b; i < e; i++){ if(a[i] == a[e]) return false; } } return true; } public void permutation(int k){ if(k >= a.length){ print(); }else{ for(int i = k; i < a.length; i++){ if(isOk(k,i)){ swap(i,k); permutation( k+1 ); swap(i,k); } } } } private void swap( int i, int k ) { int temp = a[i]; a[i] = a[k]; a[k] = temp; } private void print() { for( int i = 0; i < a.length; i++ ) { System.out.print(a[i] + " "); } System.out.println(); } public static void main( String[] args ) { Permutation p = new Permutation(new int[]{1,2,2,2}); p.permutation( 0 ); } }
c++ STL algorithm中有next_permutation可以直接调用,ACM的时候经常偷懒用这个,呵呵。
学以致用:poj 1731
http://acm.pku.edu.cn/JudgeOnline/problem?id=1731
#include<iostream> #include<algorithm> #include<vector> #include<string> using namespace std; string goods; vector<string> v; void swap(string &str,int i, int j){ char temp = str[i]; str[i] = str[j]; str[j] = temp; } bool ok(int i, int j){ if( i < j){ for(int k = i; k < j; k++){ if(goods[k] == goods[j]) return false; } } return true; } void backtrack(int i){ if(i >= goods.length()){ v.push_back(goods); } for(int j = i; j < goods.length(); j++){ if(ok(i,j)){ swap(goods,i,j); backtrack(i + 1); swap(goods,i,j); } } } int main(){ cin >> goods; backtrack(0); sort(v.begin(),v.end()); for(int i = 0; i < v.size(); i++){ cout << v[i] << endl; } }
poj1256 http://acm.pku.edu.cn/JudgeOnline/problem?id=1256
这道题需要一种特殊的数序输出:
An upper case letter goes before the corresponding lower case letter.
So the right order of letters is 'A'<'a'<'B'<'b'<...<'Z'<'z'.
我们只需要定义一个正确的比较函数就可以了
bool cmp(const string &str1,const string &str2){ int i; int m_len = min(str1.length(), str2.length()); for(i = 0; i < m_len; i++){ if(str1[i] != str2[i]) break; } if(i == m_len){ return str1.length() < str2.length(); }else if(tolower(str1[i]) == tolower(str2[i])) { return str1[i] < str2[i]; }else{ return tolower(str1[i]) < tolower(str2[i]); } }
或者
bool cmp(char c1,char c2){ if(tolower(c1) == tolower(c2)) return c1 < c2; else return tolower(c1) < tolower(c2); }
这样我们的代码就出来了:
#include<iostream> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<cmath> using namespace std; string str; vector<string> permutations; bool cmp(const string &str1,const string &str2){ int i; int m_len = min(str1.length(), str2.length()); for(i = 0; i < m_len; i++){ if(str1[i] != str2[i]) break; } if(i == m_len){ return str1.length() < str2.length(); }else if(tolower(str1[i]) == tolower(str2[i])) { return str1[i] < str2[i]; }else{ return tolower(str1[i]) < tolower(str2[i]); } } void swap(int i,int j){ char temp = str[i]; str[i] = str[j]; str[j] = temp; } bool isOk(int i,int j){ if(i < j){ int k; for(k = i; k < j; k++){ if(str[k] == str[j]) return false; } } return true; } void backtrack(int i){ if( i >= str.length()){ permutations.push_back(str); return; } int j; for(j = i; j < str.length(); j++){ if(isOk(i,j)){ swap(i,j); backtrack(i+1); swap(i,j); } } } int main(){ int n; cin >> n; int i,j; for(i = 0; i < n; i++){ cin >> str; permutations.clear(); backtrack(0); sort(permutations.begin(),permutations.end(),cmp); for(j = 0; j < permutations.size(); j++){ cout << permutations[j] << endl; } } }
我们还是用STL来爽爽这道题吧:
#include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; string str; bool cmp(char c1,char c2){ if(tolower(c1) == tolower(c2)) return c1 < c2; else return tolower(c1) < tolower(c2); } int main(){ int n; cin >> n; int i,j; for(i = 0; i < n; i++){ cin >> str; sort(str.begin(),str.end(),cmp); cout << str << endl; while(next_permutation(str.begin(),str.end(),cmp)){ cout << str << endl; } } return 0; }
发表评论
-
二分查找之变型题目
2010-10-24 12:40 2159二分查找算法在各个公司的笔试面试题大量出现,通常不是简单一眼就 ... -
一道笔试题(创新工厂)解法
2010-10-21 17:44 1855一个帖子http://www.iteye.com/topic/ ... -
[zz]大数据量,海量数据 处理方法总结
2010-08-27 22:24 2274大数据量的问题是很多面试笔试中经常出现的问题,比如baidu ... -
Trie and suffix array
2010-04-13 20:54 1928字典数Trie和后缀数组suffix array是处理字符串操 ... -
金币问题
2009-11-09 08:41 2021今年某公司的笔试题: 一个矩阵地图,每一个元素值代表金币数, ... -
楼梯问题
2009-11-09 08:19 1579hl给我的几道某公司的算法题: 1、 有个 100 级的 ... -
一道考察模拟乘法的题目
2009-11-07 22:37 1424今天hl和我讨论一道题目: 写道 整形数组如a={1,4, ... -
链表归并
2009-11-07 21:40 1039以前gx同学问的某某公司的笔试题,写一下练练(纯手写,没编译过 ... -
找出出现次数超过一半的数字
2009-11-07 21:23 1891hl同学问我一道这个题,想了一种方法,感觉还是不错的,只扫描一 ... -
有道难题以超低分晋级
2009-06-10 11:36 1570有道难题比赛居然晋级了,可以领到一个t-shirt。 -
逆序数/逆序数对
2009-06-09 23:17 3786逆序数是个常遇到的问题,主要有两种解法: O(n^2)的方法: ... -
有道难题topcoder
2009-05-31 23:55 2463今天做了有道topcoder的题目,也是第一次在topcode ... -
百度之星第一场题目
2009-05-31 00:03 3658由于不符合参赛条件,未能参加百度之星,看了题目还挺有意思,把题 ... -
一个对字符串很好的Hash函数ELFHHash
2009-05-03 21:41 2283#include<stdio.h> #defin ... -
最大流Ford-Fulkerson算法
2009-04-22 17:33 9696算法导论对最大流算法有很详细的介绍,今天实现了最大流Ford- ... -
大数/高精度加减乘除取模[收藏]
2009-04-16 19:38 5072#include <iostream> #i ... -
差分约束系统
2009-04-15 16:00 3752(本文假设读者已经有以下知识:最短路径的基本性质、Bellma ... -
二分图匹配
2009-04-15 15:40 3731二分图最大匹配的匈牙利算法 二分图是这样一个图,它的顶点可以分 ... -
线段树
2009-03-24 10:58 1688把问题简化一下: 在自然数,且所有的数不大于30000的 ... -
树状数组
2009-03-24 10:39 2350树状数组是一种非常优雅的数据结构. 当要频繁的对数 ...
相关推荐
生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于100,其中包含重复的字符。 【输出形式】 向标准输出印...
算法分析课程作业,C语言编写,可能需要用input.txt输入,有重复数字的全排列代码
当输入元素中存在重复时,处理全排列问题会变得更为复杂。C#作为.NET框架下的主要编程语言,提供了丰富的数据结构和算法支持来解决这类问题。本篇文章将深入探讨如何使用C#解决全排列重复问题,并提供一种有效的实现...
1、输入n个数(不重复),求n个数字的全排列 如:n=3 全排列的数字为 1 2 3 则输出 123 132 213 231 321 312 2、输入n和k(n》=k)求n个数字的(n,k)排列 如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 21 23 31...
这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。下面给出...
根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的所有不重复排列(即n的全排列)。同时,还将提供一个Java实现的具体示例。 ### 回溯法简介 回溯法是一种通过尝试解决离散和组合问题的方法,...
5. 为了防止重复排列,通常需要一个辅助数组或集合来跟踪已使用的数字,确保每次选择的数字都是未被使用过的。 在实际的易语言代码中,你可能会看到类似`整数数组`、`循环`、`递归调用`等关键字和结构。此外,为了...
去重全排列的递归实现 去掉重复数字的 全排列的 递归实现
在编程领域,全排列是一种常见的算法问题,它涉及到对一组数据进行所有可能的无重复、无顺序的排列。在这个特定的场景中,我们关注的是如何使用易语言来实现数字文本的全排列。易语言是中国本土开发的一种编程语言,...
为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。...因此可以知道——全排列就是从第一个数字起每个数分别与它后面的数字交换。找到这个规律后,递归的代码就很容易写出来了:
回溯法的优点在于可以避免重复计算,只需要在每个分支上尝试所有可能的选择,直到找到解决方案或者确定无解。缺点是效率通常低于动态规划等其他算法,因为它可能涉及到大量的回溯操作。然而,对于小规模的问题,如本...
此外,对于包含重复数字的排列,使用递归方法会产生重复的排列组合,因为在生成新排列时不便于与已生成的排列进行比较。为避免重复,需要更高效的存储和检查机制,这超出了简单的递归解决方案的能力范围。 解决矩阵...
这里我们讨论的是使用易语言实现数字文本的全排列。易语言是一种中文编程语言,它以简单易懂的语法设计为特点,使得初学者也能快速上手。 全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,...
每层循环从1到4,确保不会重复使用同一个数字。`for(i=1;i;i++)`、`for(j=1;j;j++)`、`for(k=1;k;k++)`就是这个三重循环的表示。 2. **条件判断**: - `if (i!=k&&i!=j&&j!=k)` 这个条件判断确保了生成的三位数的...
初始状态下,容器为空,然后依次将数字1到6添加到容器中,每次添加时,确保新添加的数字不与容器内已有数字重复。 以下是实现该算法的基本步骤: 1. 初始化一个空容器,用于存储排列。 2. 对于每个待排列的数字,...
在C#编程中,我们经常会遇到需要解决排列组合问题,比如本题所示的例子:如何用1、2、3、4这四个数字组成互不相同且无重复数字的三位数,并计算总数以及列举出所有可能的组合。这个问题属于组合数学中的全排列问题,...
递增进位制数法和递减进位制数法是实现全排列的另外两种方法,它们将排列的构造类比为数字的进位过程,通过改变“进位”位置来生成新的排列。邻位对换法则是一种更直观的排列生成方法,通过交换排列中的相邻元素来...
全排列的生成算法是指对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。任何 n 个字符集的排列都可以与 1~n 的 n 个数字的排列一一对应,因此在此就以 n 个数字的排列为例说明排列的生成...
在实际编程中,全排列的算法不仅适用于字符数组,还可以应用于数字数组或其他可比较类型的数组,为解决各种排列组合问题提供基础。理解并掌握这种算法,对于提升Java编程能力,特别是在处理复杂问题时,是非常有帮助...