博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道笔试题
阅读量:6820 次
发布时间:2019-06-26

本文共 1968 字,大约阅读时间需要 6 分钟。

hot3.png

  1. 分析

    1. 诚然,最先想到的方法就是10层循环(OMG!),这显然是一个很可怕的方法(虽然这并没有错)。

    2. 那么我们该怎么办呢?

    3. 接下来就该想到将这62个字符对应一个固定的下标,我们按一定的方法生成一个下标数组,然后取出对应的字符组成字符串,就是我们要的结果啊!

    4. 那么这个下标数组该如何生成呢?

    5. 我们可以维护一个包含10个下标值的数组(因为元素不能重复,所以初始值可以设定为(0,1,2,3,4,5,6,7,8,9),而不是(0,0,0,0,0,0,0,0,0)),

      1. 然后检查其中是否有重复的下标?如果有,则不符合要求,进行下一步;如果没有,则符合要求,输出其对应的字符串;

      2. 将数组中最后一个数加1,然后从后向前遍历数组,每个数(原始字符串的长度)除以62,将结果加到前一个数上,其本身对62取余;

      3. 检查这个数组是否已经遍历完所有的组合(数组中所有的数都是61),没有,则返回(i)步开始执行,否则程序结束

代码

public class Main {	private static final String originalStr = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";		public static void main(String[] args) {		int[] charArr = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 61};		while(notTheEnd(charArr)) {			if(isOK(charArr)) {				System.out.println(getString(charArr));			}			addOne(charArr);		}	}		/**	 * 查看charArr是否已经查找到最后一个值,即所有的值都是61	 * @param charArr	 * @return	 */	private static boolean notTheEnd(int[] charArr) {		for(int i = 0; i < charArr.length; i++) {			if(charArr[i] < 61)				return true;		}		return false;	}		/**	 * 将charArr的最后一个值加1,超过61,要对62取余,并向前一个数进位	 * @param charArr	 */	private static void addOne(int[] charArr) {		int len = originalStr.length();		charArr[charArr.length - 1]++;				int carry = 0;		for(int i = charArr.length - 1; i >= 0; i--) {			charArr[i] += carry;			carry = charArr[i] / len;			charArr[i] %= len;		}	}		/**	 * 查看charArr中是否有重复值	 * @param charArr	 * @return	 */	private static boolean isOK(int[] charArr) {		for(int i = 0; i < charArr.length; i++) {			for(int j = i + 1; j < charArr.length; j++) {				if(charArr[i] == charArr[j])					return false;			}		}		return true;	}		/**	 * 将charArr中数字所对应的字符,组成字符串返回	 * @param charArr	 * @return	 */	private static String getString(int[] charArr) {		StringBuffer sb = new StringBuffer();		for(int i = 0; i < charArr.length; i++) {			sb.append(originalStr.charAt(charArr[i]));		}				return sb.toString();	}}

总结

总体思想还是进制的问题。算法还是有些幼稚,还有很多地方可以优化,如:

  1. 如何判断数组中是否有重复值;

  2. 如果有重复值出现,如何快速跳动到下一个不包含重复值的数组;

转载于:https://my.oschina.net/lovewxm/blog/519613

你可能感兴趣的文章
ArcGIS Server9.2服务器搭建时的一个错误及解决方法
查看>>
webpy使用笔记(二) session的使用
查看>>
Windows Azure HandBook (1) IaaS相关技术
查看>>
【温故而知新-Javascript】使用 Ajax
查看>>
c#如何处理自定义消息
查看>>
毅力----如何培养自律的习惯(漫画版)
查看>>
POP3与IMAP协议
查看>>
[C]有符号数和无符号数
查看>>
结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?
查看>>
Windows Mobile打包时增加快捷方式到开始菜单的方法
查看>>
深度解析C++拷贝构造函数
查看>>
今天的主角:豆豆。
查看>>
Oracle: 四、对scott用户的基本查询操作(上篇)
查看>>
[Map 3D开发实战系列] Map Resource Explorer 之三-- 添加AutoCAD风格的Palette界面
查看>>
QC在win7远程执行QTP脚本excel不能读取,及其其他win7问题解决方案(图解转)
查看>>
LVS
查看>>
iOS:iPad和iPhone开发的异同(UIPopoverController、UISplitViewController)
查看>>
使用goto跳转到switch的某个case
查看>>
SPSS学习系列之SPSS Statistics导入读取数据(多种格式)(图文详解)
查看>>
ABP理论学习之Abp Session
查看>>