文档章节

一道笔试题

小强零号
 小强零号
发布于 2015/10/21 00:38
字数 650
阅读 151
收藏 6
  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)步开始执行,否则程序结束


  2. 代码

  3. 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();
    	}
    }
  4. 总结

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

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

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



© 著作权归作者所有

共有 人打赏支持
小强零号
粉丝 6
博文 31
码字总数 12473
作品 0
长宁
程序员
18届清华硕士狂拿18家互联网公司offer

2018校招总结(外企,国内大公司,国内创业公司) 本篇是我参加2018春招实习和秋招的求职经历,除了笔试面试中遇到的一些问题,更多的是一些个人想法。 春招和秋招面了不少公司,实习offer有...

野梦M
2017/12/18
0
1
HR怎么从面试中了解程序员的真实水平?

HR肯定不懂或至少不太懂专业技术,这点,是一定的。 一个外行,怎么面试内行,很多求职者会很好奇。 其实,HR初试,更多的是看“人怎么样”,对“能力行不行”的观察,只是一个大概的情况,后...

明哥聊求职
2017/11/27
0
0
请教各位朋友们,django如何实现在线笔试系统

各位朋友们好,最近有在做在线笔试系统,在数据库里建立用户表,试卷表,用户笔试得分表,但是具体地如何在点击下一题显示下一道题目,在最后提交的时候,把结果进行提交,并如何评判笔试结果...

qingyuanlu
2015/09/28
130
0
一道算法笔试题,大家来看看

最近校园招聘比较火爆,参加了不少公司的笔试,昨天的网康笔试里有一道算法题,大家来看看怎么做: 大概是这样的:N个人围成一个圆圈,从某个人开始报数,报数为K的倍数的人退出这个圆圈,其...

YueZheng
2012/10/24
505
7
一个找规律的题目,小弟驽钝

77 49 36 () 8,括号内该填啥,一道笔试题,不得其解

Padding
2012/12/24
317
7

没有更多内容

加载失败,请刷新页面

加载更多

Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
1
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0
Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
3
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部