中兴笔试题目,题目要求很简单,给定两个字符串(忽略大小写),找出两个字符串的公共字符,将这些字符按照组合成指定长度的字符串,但是要按照字典序排序,比如:给定字符串a="RadheGupta",b="RADHIKA",指定长度为3,那么输出为[adh, adr, ahr, dhr],因为公共的字符为adhr,将adhr进行一个排列组合即可。

本题的求公共的字符很容易,难点就是后面的排列组合,排列组合的算法也挺多,下面我讲一种比较简单的方法:

比如给定一个字符串“abcd”进行组合,有哪些组合情况呢?每一个字符有两种选择,要么选要么不选,那么就有2的n次方种组合情况,其中n为字符串的长度,所以我们可以用一个整数来表示每一种组合情况,定义一个整数bit为2的n次方,然后从0到bit-1就包含了所有的组合可能,其中0表示不选,1表示选中,那么我们怎么判断哪一位是0还是1呢?

这里我贴一下代码,看着代码比较清晰,代码里面有详细的注释:

//排列组合求所有的可能

// 求出字符串的长度

int len = commonChars.length();

// 定义一个整数为2的len次方

// 从0到2的len次方减1,这里有2的len次方种情况,涵盖了所有的组合

int bit = 1 << len;

// 从0开始for循环遍历

for(int i = 0;i < bit;i++){

// 定义一个StringBuilder用来保存每一种情况

StringBuilder tmp = new StringBuilder();

// 右移的位数

for(int j = 0;j < len;j++){

// 判断i右移j为是否为1,如果为1,那么去字符串的第j位字符

// 比如:i = 1,二进制位0001(前面省略28个0)

// 当j = 0,表示右移0位,也就是原数0001,此时和1相与结果为1

// 那么追加字符串的第0位到tmp,这里就是a。以此类推

if(((i >> j) & 1) == 1){

// 追加到tmp

tmp.append(commonChars.charAt(j));

}

}

// 判断是否达到指定的长度

if(tmp.length() == pwdLen){

res.add(tmp.toString());

}

}

找公共的字符串比较简单,我直接贴代码(这里用数组来保存有一个好处就是可以直接得到按字典顺序排序的字符串):

// 先将字符串变为小写

String newUsreName = userName.toLowerCase();

String newMotherName = motherName.toLowerCase();

// 用于保存每个字符串出现的字符

int[] userNameIndex = new int[256];

int[] motherNameIndex = new int[256];

StringBuilder sb = new StringBuilder();

// 找公共的字符,并且按照字典顺序排序

// 遍历每一个字符串,将每个字符出现的字符存到该字符对应的index

for(int i = 0;i < newUsreName.length();i++){

userNameIndex[newUsreName.charAt(i)]++;

}

for(int i = 0;i < newMotherName.length();i++){

motherNameIndex[newMotherName.charAt(i)]++;

}

// 遍历两个数组,找出两个数组都不为0的下标,即两个字符串公共出现的字符

for(int i = 0;i < 256;i++){

if(userNameIndex[i] != 0 && motherNameIndex[i] != 0){

sb.append((char)i);

}

}

完整的代码:

public static List getPwd(String userName,String motherName,int pwdLen){

List res = new ArrayList();

// 先将字符串变为小写

String newUsreName = userName.toLowerCase();

String newMotherName = motherName.toLowerCase();

// 用于保存每个字符串出现的字符

int[] userNameIndex = new int[256];

int[] motherNameIndex = new int[256];

StringBuilder sb = new StringBuilder();

// 找公共的字符,并且按照字典顺序排序

// 遍历每一个字符串,将每个字符出现的字符存到该字符对应的index

for(int i = 0;i < newUsreName.length();i++){

userNameIndex[newUsreName.charAt(i)]++;

}

for(int i = 0;i < newMotherName.length();i++){

motherNameIndex[newMotherName.charAt(i)]++;

}

// 遍历两个数组,找出两个数组都不为0的下标,即两个字符串公共出现的字符

for(int i = 0;i < 256;i++){

if(userNameIndex[i] != 0 && motherNameIndex[i] != 0){

sb.append((char)i);

}

}

String commonChars = sb.toString();

//排列组合求所有的可能

// 求出字符串的长度

int len = commonChars.length();

// 定义一个整数为2的len次方

// 从0到2的len次方减1,这里有2的len次方种情况,涵盖了所有的组合

int bit = 1 << len;

// 从0开始for循环遍历

for(int i = 0;i < bit;i++){

// 定义一个StringBuilder用来保存每一种情况

StringBuilder tmp = new StringBuilder();

// 右移的位数

for(int j = 0;j < len;j++){

// 判断i右移j为是否为1,如果为1,那么去字符串的第j位字符

// 比如:i = 1,二进制位0001(前面省略28个0)

// 当j = 0,表示右移0位,也就是原数0001,此时和1相与结果为1

// 那么追加字符串的第0位到tmp,这里就是a。以此类推

if(((i >> j) & 1) == 1){

// 追加到tmp

tmp.append(commonChars.charAt(j));

}

}

// 判断是否达到指定的长度

if(tmp.length() == pwdLen){

res.add(tmp.toString());

}

}

return res;

}

输入测试用例:

RadheGupta

RADHIKA

3

运行结果,满足要求:

第一次写博客,经验不足,望大家多多包涵!

标签:tmp,字符,java,int,笔试,len,++,字符串,排列组合

来源: https://blog.csdn.net/qq_22595041/article/details/82384088

Java中兴通讯最新笔试题_java实现中兴通讯笔试程序题,排列组合所有可能的密码...相关推荐

  1. java与mysql笔试题_JAVA和数据库笔试题

    java部分: 选择:1.下面的执行结果: Java代码 public class Test3 { public static void main(String args[]){ int a=222; ...

  2. java异常return笔试题_Java笔试面试总结—try、catch、finally语句中有return 的各类情况...

    前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try-catch-finally 语法块的执行顺序等问题,今天就抽空整理了一下这个知识点,然后记录下来. 正文 本篇文章主要是通过举例的方式来阐 ...

  3. 中国人民银行计算机招聘笔试题和答案(笔试真题)

    中国人民银行计算机招聘面试题(笔试真题) 试题一 网络基础 1.计算机网络是______________与______________相结合的产物. 2.按计算机连网的区域大小,我们可以把网络分为__ ...

  4. java高级编程笔试题_JAVA 高级编程笔试题

    <使用Java实现面向对象编程>阶段测试-笔试试卷 一.选择题(共25题,每题4分,满分100分) 1)下列选项中关于Java中ArrayList.LinkedList.HashMap三个 ...

  5. 京东校招java笔试题_2017京东校招笔试编程题:进制转换、辗转相除

    题目描述 时间限制:C/C++语言 1000MS 其他语言:3000MS 内存限制:C/C++语言 65536KB 其他语言:589824KB 题目内容:尽管是一个CS专业的学生,小B的数学基础很好并 ...

  6. tcl c语言笔试题,TCL2014校园招聘笔试真题及答案

    1.ADO.net中常用的对象有哪些?分别描述一下. 答:Connection数据库连接对象Command数据库命令DataReader数据读取 器DataSet数据集 2.什么是code-Behin ...

  7. 2018 java 字节跳动笔试题

    想进字节跳动同学注意了,这里是修真院面试笔记整理,那么这里就给大家分享一下 [2018 java 字节跳动笔试题] 一面 实现算法:求全排列. 输入:一个整数n 输出:从1至n所有数字组成的全排列 简 ...

  8. java笔试题大全带答案_java笔试题大全带答案经典11题

    java笔试题大全带答案(经典11题) 1.不通过构造函数也能创建对象吗() A. 是 B. 否 分析:答案:A Java创建对象的几种方式(重要): (1) 用new语句创建对象,这是最常见的创建对 ...

  9. 分享18道Java基础面试笔试题

    转载自 分享18道Java基础面试笔试题(面试实拍) 1.你最常上的两个技术站和最常使用的两个app分別进什么?主要解决你什么需求? 2.请简述http协议中get请求和post请求的区别. 3.请简 ...

  10. JAVA面试、笔试题

    @[TOC]目录 JAVA面试.笔试题 @目录 一. CoreJava部分 7 1. java中有哪些基本类型? 7 2. java反射 7 3. 易错,理解题 7 4. Java有几种创建对象的方法 ...

最新文章

  1. 获取crm服务器信息失败,无法连接到 Dynamics CRM 服务器,因为凭据身份验证 - Dynamics 365 Sales | Microsoft Docs...
  2. python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...
  3. Oracle ——如何确定性能差的 SQL
  4. 简单搭建一个SSM项目(一)
  5. Windows环境下手动更新boot2docker.iso
  6. 京东金融以支付开启出海之旅,未来或拓展至消费金融
  7. oracle r修改表名,oracle中修改表名
  8. Spring事务-1
  9. python django项目管理系统_python3+django2开发一个简单的人员管理系统
  10. 计算机硬件小游戏,小学信息技术第一册《认识计算机——计算机的硬件组成》教案...
  11. JS基础到结束知识详细大汇总
  12. xsmax进入dfu模式_iPhone如何进入DFU模式
  13. 今天考了关于java认证的OCJP,特此谈谈个人java学习过程及心得
  14. 高三计算机教学计划,高三上学期教学教学计划集锦5篇
  15. 应用统计学与R语言实现学习笔记(八)——方差分析
  16. 龙芯笔记本走出国门的困惑
  17. Workbook 对象 应用示例
  18. 手动在电脑桌面制作关机/重启图标并添加到任务栏
  19. Linux-常见命令(二)
  20. surfacepro3运行C语言,终于等来USB-C接口!微软 发布 Surface Pro 7 与 Surface Laptop 3 笔记本电脑...

热门文章

  1. C盘空间不够?win10自带mklink命令给C盘软件搬家减负【计算机小白必备】
  2. 最新python腾讯文档界面自动打卡
  3. python3爬取微博评论教程_python3爬取微博评论并存为xlsx
  4. 数字电压表设计程序用c语言at89c51 adc0808,51单片机的ADC0808数字电压表设计
  5. DP1363F多协议高射频与CLRC663软硬件开发无需修改资料
  6. B2B网站平台建设:优势、功能、模块三大方向解析
  7. 互联网+智慧用电:智能微型断路器应用发展浅析-李亚俊
  8. 电信基站大区对应表_铁塔基站直流电能表 直流计量表
  9. Excel 通过 CONCATENATE 函数生成SQL
  10. TextView 倾斜属性