21 七月 2008

一个面试题

用1、2、2、3、4、5这六数,打印出所有不同的排列,要求:"4"不能在第三位,"3"与"5"不能相连。

要求用Java做,我试着用C语言做了下。

#include <stdio.h>
int checkNum(int num);//检查是否是122345五个数字构成
int checkCondition1(int num);//先判断除了2可以重复两次以外,其它各位不能存在重复的情况
int checkCondition2(int num);//判断4是否在第三位
int checkCondition3(int num);//判断3与5是否相连
int checkIsMyNum(int num);

void main()
{
int num=122345;
int i=0;
int count=0;

for(;num<=543221;num++)
{
if(checkNum(num))
{
if(checkCondition1(num)&&checkCondition2(num)&&checkCondition3(num))
{
printf("%d ",num);
i++;
count++;
if(i==10)
{
i=0;
printf("\n");
}
}
}
}

printf("\n%d",count);
}

int checkCondition3(int num)//判断35相连
{
int temp1=num%10;
int temp2=num%10;
while(1)
{
num=num/10;
temp1=temp2;
temp2=num%10;
if((temp1==3&&temp2==5)||(temp1==5&&temp2==3))
{
return 0;
}
if(num/10==0)
{
break;
}
}

return 1;
}

int checkCondition2(int num)
{
int i=0;
while(1)
{
int temp=num%10;
i++;
if(i==3)//如果是第三位
{
if(temp==4)
{
return 0;
}
else
{
return 1;
}
}
if(num/10==0)
{
break;
}
num=num/10;
}
}

int checkIsMyNum(int num)
{
if(num==1||num==2||num==3||num==4||num==5)
{
return 1;
}
else
{
return 0;
}
}

int checkNum(int num)
{
int temp;
do
{
temp=num%10;
if(!checkIsMyNum(temp))
{
return 0;
}

if(num/10==0)
{
break;
}
num=num/10;
}while(1);

return 1;
}

int checkCondition1(int num)
{
int criterion[6]={1,2,2,3,4,5};
int i=0;


//先判断除了2可以重复两次以外,其它各位不能存在重复的情况
while(1)
{
int temp=num%10;


for(i=0;i<6;i++)
{
if(criterion[i]==temp)
{
criterion[i]=0;
break;
}
}

if(num/10==0)
{
break;
}

num=num/10;
}


for(i=0;i<6;i++)
{
if(criterion[i]>0)
{
return 0;
}
}

return 1;
}

因为限时做的,所以有点乱,没有考虑流程的优化和效率问题。最后答案是198种。

18 七月 2008

AutoHotkey——小巧强大的脚本软件

AHK 是一款叫做 AutoHotKey 的脚本软件的缩写,它是改造 Windows 必备的软件!用了它你可以替换掉很多软件。(俺是程序员,不是文学家,所以这句话照抄别人的,但是软件确实是好软件)

AHK可以做什么?从应用的角度来说,可以编写脚本实现屏幕取色,编写脚本实现时间定时……(反正功能太强了),对于我来说有什么好处?

平常使用MyEclipse编写JavaEE的东西,经常需要web服务器的重新部署,通过AHK来录制宏命令,这样每次需要类似的重新部署的时候,运行宏,全部自动搞定o(∩_∩)o...(当然ant也可以,但是东西小的时候ant就有点大材小用了)。

这里有很多AHK的具体应用实例:http://www.appinn.com/tag/ahk/

AHK官方网站:www.autohotkey.com

11 七月 2008

SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()介绍

今天看了下MP3在线搜索器的源代码,发现里面出现了SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()这两个方法。以前做Swing事件响应的时候从来没有用过,所以网上查了下,大概明白他们的作用。

举个例子,比如单击按钮实现某些操作,我们一般使用ActionListener监听器来调用actionPerformed方法来完成按钮的功能。这样的做法一般来说没有问题,但是某些情况下会出现问题。比如单击按钮要执行很费时的操作,此时你的按钮就会始终处于按下的状态,而且导致界面其他的组件无法正常使用,好像界面死了一样。这是由于Swing不是线程安全的,它是单线程的设计,因此如果它处于某种费时的操作,由于单线程设计的缘故,会导致其他操作在当前功能未完毕之前无法启动。如何解决这类问题,就可以考虑使用SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()这两个方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块,即当前费时的操作不会影响Swing中的其他操作。如果你希望部件能够立即显示或重画,而处理代码在后台运行,那么你就可以使用invokeLater。invokeAndWait指的是当前线程阻塞,一直等待invokeAndWait中指定的代码执行完毕之后,才接着运行,这种方式用的不多。