招银java笔试题目_招银编程笔试题 - osc_0boqdoe2的个人空间 - OSCHINA - 中文开源技术交流社区...

企业面试题-招银编程题

(1)洗牌题目

题目简述

一个牌的数值分别是0,1,2,3,4,5,6,7,8,9;当用户指定一个n,即代表有n张牌,且分别是介于0~9之前的任意数组成。小明把拿到的这n张牌分为两堆,左边一堆,右边一堆,如果n是奇数张牌,就把左堆的牌数比右边多一个;如果牌数是偶数,就左右堆平均分配即可。在洗牌的时候,如果是第奇数此洗牌,就先左边一张牌(默认把牌排成一排从后边取),再拿右边一张牌,依次这样往复的出完牌。如果是偶数次洗牌,则是先从右边堆中取出一张牌,再从左边取出一张牌,依次类推取完牌。最终输出洗完牌的顺序。

举例

如:牌为1 2 3 4 5 6 (此时牌为偶数张)

偶数次洗牌得出的最终牌为:1 4 2 5 3 6

此时再把上述洗后的牌再洗牌(此时就是奇数次洗牌了):5 1 3 4 6 2

输入

第一个数为这个牌有几张(n)牌数,第二个数为洗牌的次数,后边的n个数就是牌的面值,如下

6 1 1 2 3 4 5 6 [解释:7代表7张牌,1 代表第1次洗牌,1 2 3 4 5 6 代表牌面数]

输出

4 1 5 2 6 3

java代码

package ncompanydemos.p1_zhaopin;

import java.util.Arrays;

import java.util.Scanner;

/**

* @author jiyongjia

* @create 2020/6/22 - 21:59

* @descp:

* > 题目描述:

* 一个牌的数值分别是0,1,2,3,4,5,6,7,8,9;当用户指定一个n,即代表有n张牌,且分别是介于0~9之前的任意数组成。

* 小明把拿到的这n张牌分为两堆,左边一堆,右边一堆,如果n是奇数张牌,就把左堆的牌数比右边多一个;如果牌数是偶数,

* 就左右堆平均分配即可。在洗牌的时候,如果是第奇数此洗牌,就先左边一张牌(默认把牌排成一排从后边取),再拿右边一张牌,

* 依次这样往复的出完牌。如果是偶数次洗牌,则是先从右边堆中取出一张牌,再从左边取出一张牌,依次类推取完牌。最终输出洗完牌的顺序。

* > 举例

* 如:牌为1 2 3 4 5 6 (此时牌为偶数张)

* 偶数次洗牌得出的最终牌为:1 4 2 5 3 6

* 此时再把上述洗后的牌再洗牌(此时就是奇数次洗牌了):5 1 3 4 6 2

* > 输入

* 第一个数为这个牌有几张(n)牌数,第二个数为洗牌的次数,后边的n个数就是牌的面值,如下

* 6 1 1 2 3 4 5 6 [解释:7代表7张牌,1 代表第1次洗牌,1 2 3 4 5 6 代表牌面数]

* > 输出

* 4 1 5 2 6 3

*

*/

public class Exam01 {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

System.out.println("请按要求输入:");

int total = scanner.nextInt(); //总牌数

int cishu = scanner.nextInt(); //洗牌的次数

//存储牌面数

int[] arr = new int[total];

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

arr[i] = scanner.nextInt();

}

//调用方法

int[] res = shuffle(total, cishu, arr);

System.out.println("输出:");

System.out.println(Arrays.toString(res));

}

//洗牌

private static int[] shuffle(int total, int cishu, int[] arr) {

int leftIndex; //指向左堆的最后一个元素

int rightIndex; //指向右堆的最后一个元素

int[] res = new int[total];

int index = arr.length - 1;//在新数组中添加元素的index

//1 如果是偶数的牌数,就分成平均的两堆

if (total % 2 == 0) {

leftIndex = arr.length / 2 - 1;

rightIndex = arr.length - 1;

int count = arr.length / 2;

while (count > 0 && (leftIndex >= 0 && rightIndex <= arr.length - 1)) {

//1.1 判断奇数次洗牌的时候,先出左牌

if (cishu % 2 == 1) {

res[index--] = arr[leftIndex--]; //先出左堆

res[index--] = arr[rightIndex--]; //再出右堆

} else { //1.2 判断偶数次洗牌的时候,先出右边堆牌

res[index--] = arr[rightIndex--]; //先出右堆

res[index--] = arr[leftIndex--]; //再出左堆

}

}

} else {//2 如果是奇数次的牌数,就分成左边比右边多一个的两堆

leftIndex = arr.length / 2;

rightIndex = arr.length - 1;

int count = arr.length / 2;

while (count > 0 && (leftIndex >= 0 && rightIndex <= arr.length - 1)) {

//2.1 判断奇数次洗牌的时候,先出左牌

if (cishu % 2 == 1) {

res[index--] = arr[leftIndex--]; //先出左堆

res[index--] = arr[rightIndex--]; //再出右堆

//左边多的那张牌出出来

res[index--] = arr[leftIndex]; //此时不减了,再减1就越界

} else { 2.2 判断偶数次洗牌的时候,先出右边堆牌

res[index--] = arr[rightIndex--]; //先出右堆

res[index--] = arr[leftIndex--]; //再出左堆

//左边多的那张牌出出来

res[index--] = arr[leftIndex]; //此时不减了,再减1就越界

}

}

}

return res;

}

}

输出验证:

验证1:

输入:6 1 1 2 3 4 5 6 (模拟奇数次洗牌)

db236b9092812dfe17e155f6e626d9c5.png

验证2:

输入:6 2 1 2 3 4 5 6 (模拟偶数次洗牌)

0538fea99ca0b1cfb0f9a031bc61f923.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值