侧边栏壁纸
博主头像
这就是之谦博主等级

我们的征途是星辰大海

  • 累计撰写 182 篇文章
  • 累计创建 3 个标签
  • 累计收到 16 条评论
标签搜索

目 录CONTENT

文章目录

恒生电子笔试题21.9

这就是之谦
2021-09-12 / 0 评论 / 0 点赞 / 561 阅读 / 3,355 字
温馨提示:
本文最后更新于 2021-11-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

恒生电子笔试题

1、给定N张扑克牌和一个随机函数,设计一个洗牌算法

做这道题的时候,开始不太清楚在线编码平台的使用,确实用的比较少,平时做ACM类的题和本地编译器比较熟悉,在线编译器不是很熟悉,所以搞了很多乌龙,最后java没写出来,转战c++编码,好在写出来了,最后仔细读要求意识是需要导包的问题。哈哈哈。敲c++的时候突然意识到这点,没时间改,就直接交了。现在补一下java的代码,实现起来并不难。

package com.lxw.demo;

import java.util.Random;

public class Demo02 {

    /**
     * 初始化数组
     * @param a
     */
    private static void init(int[] a){
        for(int i=0;i<a.length;i++){
            a[i]=i+1;
        }
    }

    /**
     * 输出
     * @param a
     */
    private static void print(int[] a){
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println();
    }

    /**
     * 洗牌
     * @param a
     */
    private static void shuffle(int[] a){
        int len=a.length;
        //计算机的随机数并发真正的随机数,而是由一系列的随机函数生成的确定序列
        Random random=new Random(System.currentTimeMillis());
        for(int i=0;i<len-1;i++){
            //生成i后面的随机数
            int pos=random.nextInt(len-i)+i;
            System.out.println("pos="+pos);
            //把a[i]和随机出的排在a[i]后面的a[pos]交换一下
            int tmp=a[i];
            a[i]=a[pos];
            a[pos]=tmp;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        int[] a =new int[5];
        init(a);
        shuffle(a);
        print(a);
        Thread.sleep(2000);
        init(a);
        shuffle(a);
        print(a);
    }
}

2、在n个数字中,找出所有和为SUM的组合

package com.lxw.demo;

import java.util.ArrayList;
import java.util.Arrays;

public class Demo03 {
    public static void main(String[] args) {
        int[] a = {2, 6, 1, 7, 4, 9};
        final int SUM = 20;
        ArrayList<String> x = findAll(a, SUM);
        for(String s:x) {
            System.out.println(s);
        }
    }


    private static ArrayList<String> findAll(int[] a, final int SUM) {
        ArrayList<String> result = new ArrayList<>();    //存放的是所有找到的表达式
        Arrays.sort(a);    //对初始数据进行排序,便于算法的实现
        ArrayList<Integer> l = new ArrayList<>();    //存放的是当前找到的合法的元素(数字),这些元素的和小于SUM
        find(a, SUM, 0, l, result);    //通过递归的方式进行查找
        return result; //返回所有的表达式
    }


    //递归函数,每一次的动作很简单,
    //在已经找到的n个元素的基础上(原则就是和小于SUM),寻找第n+1个元素,
    private static void find(int[] a, final int SUM, int cur, ArrayList<Integer> l, ArrayList<String> result) {
        int start = l.size() == 0 ? 0 : l.get(l.size()-1) + 1;    //当前元素的查找范围的起始位置,0/获取l的当前元素+1,得比最后一个满足的元素大,不然就会从这个元素开始找,就会出现数据重复
        for(int i=start; i<a.length; i++) {    //从起始位置到结束位置,查找合适的元素
            cur += a[i];    //在前面元素的和的基础上,加上当前元素,cur代表当前和
            if(cur<SUM) {    //如果cur<SUM,证明当前元素(第n+1个)合法,继续寻找第n+2个元素
                l.add(i);
                find(a, SUM, cur, l, result);
                //下面两行:消除第i个元素的影响,为了试验第i+1个元素做准备
                cur -= a[i];
                l.remove(l.size()-1);
            }else if(cur == SUM) {    //如果等于SUM,证明找到了表达式
                // 构造表达式字符串,并存入result
                StringBuilder s = new StringBuilder();
                for(int x:l) {
                    s.append(a[x]);
                    s.append(" + ");
                }
                s.append(a[i]);
                s.append(" = ");
                s.append(SUM);
                result.add(s.toString());

                break;    //回溯到上一个状态
            }else {    //如果大于SUM,也回溯到上一个状态
                break;
            }
        }
    }
}



0

评论区