【华三通讯2011年校招编程题】题目:编写一个函数,用于生成随机密码,参数为随机密码长度,密码必须同时包含大小写字母和数字。
【思路】先随机生成大写字母、小写字母和数字的个数,然后密码的每一位都随机从这3类中抽取。
private static String randomPW(int len){
if(len<3){
throw new IllegalArgumentException("长度不能小于3!");
}
int lowweCaseNO,higherCaseNo,numberNo;
Random random = new Random();
lowweCaseNO=0;
while (true) {
lowweCaseNO=random.nextInt(len)+1;
if (lowweCaseNO<=len-2) {
break;
}
}
while (true) {
higherCaseNo=random.nextInt(len-lowweCaseNO)+1;
if (higherCaseNo<=len-lowweCaseNO-1) {
break;
}
}
numberNo=len-lowweCaseNO-higherCaseNo;
int select=-1;
int count=0;
StringBuilder stringBuilder=new StringBuilder(len);
while (count<len) {
select=random.nextInt(3)+1;
switch (select) {
case 1://大写字母
if (higherCaseNo==0) {
continue;
}
char selectHigher=(char) (random.nextInt(26)+'A');
stringBuilder.append(selectHigher);
higherCaseNo--;
count++;
break;
case 2://小写字母
if (lowweCaseNO==0) {
continue;
}
char selectLower=(char) (random.nextInt(26)+'a');
stringBuilder.append(selectLower);
lowweCaseNO--;
count++;
break;
case 3://数字
if (numberNo==0) {
continue;
}
char selectNumber=(char) (random.nextInt(9)+'0');
stringBuilder.append(selectNumber);
numberNo--;
count++;
break;
}
}
return stringBuilder.toString();
}