欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

13张扑克牌的顺序

程序员文章站 2022-06-19 11:41:00
扑克牌取出,求出原来排序最近发现了个有趣的问题:(叙述不专业,体谅)有13张扑克牌,里面有1~K,花色不用处理,假设是同一花色。将他们以一定的顺序排列,然后执行如下操作:从最上面的开始,取出第一张,放到扑克牌的最后,再取出一张,亮出到桌面,是扑克牌1。再取出一张,放到最下面,再取出一张,亮出是2。。。。执行完之后,亮出的顺序是1 ~ k,求出原来的手中扑克牌顺序。用代码实现。import java.util.Arrays;/** * 扑克牌问题 * * @author Adm...

扑克牌取出,求出原来排序

最近发现了个有趣的问题:(叙述不专业,体谅)
有13张扑克牌,里面有1 ~ k,花色不用处理,假设是同一花色。
将扑克牌以一定的顺序排列,放到一起,然后执行如下操作:
从最上面的开始,取出第一张,放到扑克牌的最后,再取出一张,亮出,亮出的是扑克牌1,不放回。
再取出一张,放到最下面,再取出一张,亮出是2。。。。
执行完之后,亮出的顺序是1 ~ k,求出原来的手中扑克牌顺序。
用代码实现。

分析

这个问题可以看作一串字符串为1 ~ k数组,往数组里面存数据;
隔一个存一个,到最后返回数组索引0继续执行。
设一个指针i;
i = 0,第1个空不存,i = 1,第2个空存,存字符串"1";
i = 2,第3个空不存,i = 3,第4个空存,存字符串"2";
以此类推;
i =11,第11个空不存,i = 12,到第12个空存字符串"6";
第十三个空不存;
然后i = 13,可以取余操作,让i = i%13得到i=0。
又判断i = 0,可以存,存字符串"7";
然后i=1,不是空位,不存;i=2第一个空位,不存;i=3 ,不是空位,不存,i=4,第二个空位,存,存字符串"8";
依次执行完,可以记录存的次数,当存的次数等于传过来的数组的长度,跳出;
大概思路就是这样【本来想画图解析,太麻烦了(-- _ --)】
(建议自己分析,动手敲一下,代码是经过n次修改得来,不是直接写出的,一步一步测试,尤其是存值后最好打印一下存入之后的数组,更好的观察数组的存值变化)

import java.util.Arrays;

/**
 * 扑克牌问题
 * 
 * @author Administrator
 *
 */
public class Test02 {

	public static void main(String[] args) {

		System.out.println(Arrays.toString(getResult(13)));//测试
		System.out.println(Arrays.toString(getResult2(new String[] {"1","2","3","4","5","6","7","8","9","10","J","Q","K"})));
		

	}

	public static int[] getResult(int arr) {
		int[] result = new int[arr];

		int count = 1;
		int i = 0;
		boolean flag = false;
		while (true) {
			if (count > arr) {
				break;
			}
			if (result[i] == 0) {
				flag = true;
			}
			i++;
			if (i == arr) {
				i = i % arr;
			}
			if (result[i] == 0 && flag == true) {
				result[i] = count;
				count++;
				flag = false;
			}
		}
		return result;
	}

	public static String[] getResult2(String[] arr) {
		String[] result = new String[arr.length];

		int count = 1;
		int i = 0;
		int index = 0;
		boolean flag = false;
		while (true) {
			if (count > arr.length) {
				break;
			}
			if (result[i] == null) {
				flag = true;
			}
			i++;
			if (i == arr.length) {
				i = i % arr.length;
			}
			if (result[i] == null && flag == true) {
				result[i] = arr[index++];
				count++;
				flag = false;
			}
		}
		return result;
	}

}
结果:
[7, 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10]
[7, 1, Q, 2, 8, 3, J, 4, 9, 5, K, 6, 10]

代码分析:

传过来数组arr,里面存1~k,依次取出1 ~ k存进新的等长空数组result ;
flag记录是否扫到第一个空位,默认为false,没扫到。
用变量i遍历数组;
i = 0是第一个空;第一次扫到空的时候将falg变为true;
然后i++直接进到下一个位置,保证第二次扫到的不是第一个的空位。
i = 1是第二个空位,进入if (result[i] = = null && flag = = true),存值,flag变为false,count ++;
i = 1到if (result[i] = = null)不是空位;
i = 2到if (result[i] = = null && flag = = true),不进入,到if (result[i] = = null),修改flag;
依次循环当count > arr.length跳出,count从1加到arr.length刚好存完传过来的数组值。

原创文章,转载请标明出处,谢谢!!!

本文地址:https://blog.csdn.net/MengHen_0_0/article/details/111996980

相关标签: java