一著名软件公司的java笔试算法题的答案

本文为原创,如需转载,请注明作者和出处,谢谢!

    原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

 解题思路:

    很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6= 6!=720个递增的数。但如果是1,2,2,3,4,5,那么在这720个数中一定会有相同的数对出现(由于在这6个数中只有两个数两同,也就是说,如 果有重复的数,那么一定是一对数,如122345会出现两次)。

    排列的基本规则是分步进行。也就是说,要排列上面6个数,首先应该选择第一个数,这第一个数可以选择这6个数中的任意一个,如选择1.第二步是选择第二个数,这第二个数不能再选择已经选过的数,如1.因此,它只能从后面5个数中选择。如选择2。以此类推。

    我们也可以在程序中模拟这一过程。源程序如下:

public class test1
{
    private int[] numbers = new int[]
    { 1, 2, 3, 3, 4, 5 };
    public int n;
    private String lastResult = "";

    private boolean validate(String s)
    {
        if (s.compareTo(lastResult) <= 0)
            return false;
        if (s.charAt(2) == '4')
            return false;
        if (s.indexOf("35") >= 0 || s.indexOf("53") >= 0)
            return false;
        return true;
    }

    public void list(String index, String result)
    {
        for (int i = 0; i < numbers.length; i++)
        {
            if (index.indexOf(i + 48) < 0)
            {
                String s = result + String.valueOf(numbers[i]);
                if (s.length() == numbers.length)
                {
                    if (validate(s))
                    {
                        System.out.println(s);
                        lastResult = s;
                        n++;
                    }
                    break;
                }
                list(index + String.valueOf(i), s);
            }
        }
    }
    public static void main(String[] args)
    {
        test1 t = new test1();
        t.list("", "");
        System.out.println("总数:" + t.n);

    }
}

    其中list函数是这个算法的核心函数。index参数表示已经选择过的数,用numbers数组的索引表示。如index="012",表示 numbers的前三个数已经被选择,也表示应该选择第四个数了,而这第四个数应该从后三个数中选择。result参数表示临时的数字组合(这个数字组合 最多是5个数字,因为,如果到了6个数字,就表示已经有一个结果产生了)。在默认情况下index和result的值都是""。

    在validate中使用了  if (s.compareTo(lastResult) <= 0)进行判断,由于按这种方法进行排列,如果这6个数是递增给出的,那么排列的结果一定是递增的,但上述的6个数其中第2和第3个位置上都是2,因此,如 果出现了上一个结果不小于当前结果的情况,一定是有重复了,因此,要将这部分数过滤出去。

使用1, 2, 2, 3, 4, 5的测试结果

122345

122543

123245

123254

123425

123452

125234

125243

125423

125432

132245

132254

132425

132452

132524

132542

142325

142523

143225

143252

145223

145232

152234

152243

152324

152342

152423

152432

212345

212543

213245

213254

213425

213452

215234

215243

215423

215432

221345

221543

223145

223154

223415

223451

225134

225143

225413

225431

231245

231254

231425

231452

231524

231542

232145

232154

232415

232451

232514

232541

241325

241523

242315

242513

243125

243152

243215

243251

245123

245132

245213

245231

251234

251243

251324

251342

251423

251432

252134

252143

252314

252341

252413

252431

312245

312254

312425

312452

312524

312542

315224

315242

315422

321245

321254

321425

321452

321524

321542

322145

322154

322415

322451

322514

322541

325124

325142

325214

325241

325412

325421

341225

341252

341522

342125

342152

342215

342251

342512

342521

345122

345212

345221

412325

412523

413225

413252

415223

415232

421325

421523

422315

422513

423125

423152

423215

423251

425123

425132

425213

425231

431225

431252

431522

432125

432152

432215

432251

432512

432521

451223

451232

451322

452123

452132

452213

452231

452312

452321

512234

512243

512324

512342

512423

512432

513224

513242

513422

521234

521243

521324

521342

521423

521432

522134

522143

522314

522341

522413

522431

523124

523142

523214

523241

523412

523421

541223

541232

541322

542123

542132

542213

542231

542312

542321

543122

543212

543221

总数:198

使用1,2, 3, 3, 4, 5的测试结果

123345

125433

132345

132543

133245

133254

133425

133452

143325

145233

152334

152343

152433

213345

215433

231345

231543

233145

233154

233415

233451

243315

245133

251334

251343

251433

312345

312543

313245

313254

313425

313452

315234

315243

315423

315432

321345

321543

323145

323154

323415

323451

325134

325143

325413

325431

331245

331254

331425

331452

331524

331542

332145

332154

332415

332451

332514

332541

341325

341523

342315

342513

343125

343152

343215

343251

345123

345132

345213

345231

413325

415233

423315

425133

431325

431523

432315

432513

433125

433152

433215

433251

451233

451323

451332

452133

452313

452331

512334

512343

512433

513234

513243

513324

513342

513423

513432

521334

521343

521433

523134

523143

523314

523341

523413

523431

541233

541323

541332

542133

542313

542331

543123

543132

543213

543231

543312

543321

总数:118

使用1, 3, 3, 3, 4, 5的测试结果

133345

313345

315433

331345

331543

333145

333154

333415

333451

343315

345133

433315

451333

513334

513343

513433

541333

543133

543313

543331

总数:20

时间: 2024-10-25 06:55:38

一著名软件公司的java笔试算法题的答案的相关文章

求以下java笔试题目的最佳答案!!!

问题描述 1.RCPPurposeoftheprojectTestthecandidate'slearningcapabilityandproblemsolvingskillRequirements1.DesignaneclipseRCPapplicationwhichusesmenuorbuttontodisplay"hello,world".2.Designamodulewhichwilladdmenuorbuttontothepreviousapplication,thenewm

java面试算法题之子序列与最长公共子串

LCS (Longest Common Subsquence/String) 子序列 子串 最长子序列  代码如下 复制代码 public static int getLongestCommonSubsequence(String a, String b){     int m = a.length();     int n = b.length();     int[][] dp = new int[m+1][n+1];     for(int i=0; i<=m; i++){        

java面试算法题之递增三元组子序列

给出一个无序的整数序列,返回是否存在递增的三元组子序列. 如果存在 i, j, k 使得 arr[i]即返回true:如果不存在则返回false. 解法一 public static void main(String[] args) {         int[] inputNums = { 6, 4, 3, 2, 4, 7, 1 };         System.out.println(isExist(inputNums));     } public static boolean isEx

最新java编程50题及答案

[程序1]    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数:    1"); System.out.println("第2个月的兔子对数:    

求一道数据结构算法题的答案?

问题描述 把100元钱换成1元,2元,5元,10元的有多少种换法?麻烦大家都把你们的方式写下来我参考.参考?貌似可以用递归但是我没有写过,我写过四个嵌套循环,但是确实很不行那种方式.效率问题.希望大虾们把你们的方式写出来给小弟我参考参考. 解决方案 解决方案二:循环嵌套可以稍微优化一下,比如for(intcnt10=0;cnt10<=10;cnt10++)另外,如果到某个循环,发现总和已经>100,那么就可以break了解决方案三:这个google一下,应该有详细的答案解决方案四:递归做比较好

网友曝用友致远软件公司行贿清单涉及多家政府机构

网上流传的行贿账单 "无返点不成单".现在有人站出来 曝光这个销售行业的潜规则了.昨天,某著名论坛网站博客中曝光了一家国产著名软件公司的疑似行贿记录清单,清单上包括多家政府机构和企业的详细名单.每笔业务单的返还金额.收款人等众多详细信息.这一爆炸性的消息,顿时引来各个论坛转载,不过许多网页昨天下午都被"莫名"删除,但记者昨晚搜索百度和Google,仍然发现至少有数千个网页转贴该事件内容. 网友发帖:用友致远一年返点超百万 昨日下午,一位软件业内人士向本报提供了该网站

java算法题,公司的笔试题

问题描述 java算法题,公司的笔试题 suppose you have N cakes, N is an interger>0 // at each time, you can either eat 1 cake, or 2 cakes or 3 cakes // PROBLEM: How many ways can you eat all N cakes // for example, N = 4, (1,2,1) and (1,1,2) are considered to be diffe

北京某IT公司招聘Java软件工程师有感

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 当今社会不论什么职业的都需要一个不断学习的环节,软件工程师也一样.虽然软件工程师的工作不同于程序员但是一个软件工程师其前身必定是一个优秀的程序员,软件的开发工具.开发技术在不断地发展.在校学生所能学到的东西很难跟得上发展的需要但是也不能说那些东西完全没有用,只有在完全理解了相应的基本技能之后你才能很轻松地掌握新的技能,软件技术都是一个循序渐进的过程.所以学好学校所能

软件的核心则是算法

摘要: 软件正在统治世界.而软件的核心则是算法.算法千千万万,又有哪些算法属于皇冠上的珍珠呢?Marcos Otero给出了他的看法. 什么是算法? 通俗而言,算法是一个定义明确的计算过程 软件正在统治世界.而软件的核心则是算法.算法千千万万,又有哪些算法属于"皇冠上的珍珠"呢?Marcos Otero给出了他的看法. 什么是算法? 通俗而言,算法是一个定义明确的计算过程,可以一些值或一组值作为输入并产生一些值或一组值作为输出.因此算法就是将输入转为输出的一系列计算步骤. -Thoma