1,递归,实现全排列,不许有重复(字母或数字中含有相同字符)(主要是增加了判断两个数是否需要交换,是否需要以它为基准排列)
2,把一个数组里的数组合全部列出,比如1,和2组合列出来为:1,2,12,21(java版本和c++版本)
3,正则表达式(字符串的匹配)
4, 九 宫格的输出
1,递归,实现全排列,不许有重复(字母或数字中含有相同字符)
public class Allrange {
static void perm(int a[],int k,int m)
{
if(k>=m)
{
for(int i=0;i<=k;i++)
System.out.print(a[i]);
System.out.println();
return;
}
for(int i=k;i<=m;i++)
{
int j;
for(j=k;j<i;j++)
{
if(a[j]==a[i])
break;
}
if(j<i) continue;
swap(a,i,k);
perm(a,k+1,m);
swap(a,i,k);
}
}
static void swap(int a[],int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void main(String args[])
{
int a[]=new int[]{1,2,2};
perm(a,0,a.length-1);
}
}
//将一个数组中的字符的全部组合列出,1,2列出来为 1,2,21,12
#include<iostream>
#include<string>
using namespace std;
void AllList(string ss,string pre)
{
cout<<pre<<endl;
for(int i=0;i<ss.size();i++)
{
string temp=ss;
temp.erase(i,1);
AllList(temp,pre+ss[i]);
}
}
void main()
{
string ss;
cin>>ss;
AllList(ss,"");
}
java版本
import java.lang.*;
import java.util.*;
public class p74 {
public static void main(String args[])
{
String []array=new String[]{"1","2","3"};
listAll(Arrays.asList(array),"");
}
public static void listAll(List candidate,String pre)
{
System.out.println(pre);
for(int i=0;i<candidate.size();i++)
{
List temp=new LinkedList(candidate);
listAll(temp,pre+temp.remove(i));
}
}
}
3
在含有字母和数字的字符串中,找出所有的数字组成的字符串,
public class p188 {
static String s="32fdsfd8fds0fdsf9323k32k";
public static void main(String[] args)
{
String a=s.replaceAll("[^0-9]", "");
System.out.println(a);
}
}
4,先介绍一下九宫格(一个比较特别的方阵)
(1)抽象成计算机语言就是:在一个n*n的矩阵中填入1~n*n的数字(n必须为奇数),使得每一行、每一列、对角线的累加和都相等。
(2)思路:
A: 把 1 放在最后一行的中间
B: 每次向右下角走一步,然后出现了各种情况
1)如果下(行)出界了,就在最上面对应行位置填入下一个数字
2)如果右(列)出界了,就在最左边对应列的位置填入下一个数字
3)如果该位置没有出界,且已经填入了数字,就在没走这一步之前的那个位置的同一列的上一行填入下一个数字
还有一种版本的九宫格是跟这种思路相同,但是方向不同的。(如,1 放在第0行的中间,向右下角走改为向左上角走)
import java.util.Scanner;;
public class nine {
public static void main(String args[]){
int n;
//输入n值
do{
System.out.println("n必须是奇数:");
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
}while(n%2==0);
//开始设置方阵的值
int arry[][]=new int[n][n];
int row=n-1,col=n/2;
arry[row][col]=1;
for(int i=2;i<=n*n;i++)
{
row=row+1;
col=col+1;
if(row>=n) //是否下出界
row=0;
if(col>=n) //是否右出界
col=0;
if(arry[row][col]==0)
arry[row][col]=i;
else
{
row=(row-1+n)%n-1; //还原为原来元素的上一行
col=(col-1+n)%n; //还原为原来元素的同一列
arry[row][col]=i;
}
}
//输出方阵的值
for(int m=0;m<n;m++)
{ for(int k=0;k<n;k++)
{ System.out.print(arry[m][k]+"\t");
}
System.out.println();
}
}
}