13张扑克牌的顺序

2022-07-25,

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

最近发现了个有趣的问题:(叙述不专业,体谅)
有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

《13张扑克牌的顺序.doc》

下载本文的Word格式文档,以方便收藏与打印。