zoukankan      html  css  js  c++  java
  • 阿里巴巴 出扑克牌笔试题

    阿里巴巴笔试题

    阿里的笔试真的有点难,两道笔试题一个小时,感觉只能做出一道题来,笔试的时候也没做出来,结束了之后理清思路花了一小时才写好

    1. 一副扑克牌,总共有 A 2 3 4 5 6 7 8 9 每张牌各4张,从中抽取任意张牌,牌可以有四种出法

      1. 单张牌,比如说 A
      2. 一对牌,比如说 两个2
      3. 五张牌顺子,比如说 A 2 3 4 5
      4. 六张牌连对,比如说 A A 2 2 3 3

      现在输入是10种牌每张牌的个数,如 1 1 1 2 2 2 2 2 1 1 ,指的是这10张牌每张的个数,现在问最少出几次能把牌出完。

      此时的解答是3次,出3个顺子可以达到目标。

      深度优先加回溯

      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      int find6(vector<int> datas, int start, int& loc)
      {
      	if (start >= 8)
      		return 0;
      	int min = 10;
      	int times = 0;
      	for (int i = start; i < 10; i++)
      	{
      		if (datas[i] < min )	min = datas[i];
      		if (min < 2)
      		{
      			min = 10;
      			times = 0;
      		}
      		else
      		{
      			times++;
      			if (times == 3)
      			{
      				loc = i - 2;
      				if (min == 4)
      					return 2;
      				else
      					return 1;
      			}
      		}
      	}
      	return 0;
      }
      void sub6(vector<int>& datas, int loc, int times)
      {
      	datas[loc] -= 2*times;
      	datas[loc+1] -= 2*times;
      	datas[loc+2] -= 2*times;
      }
      
      void add6(vector<int>& datas, int loc) {
      	datas[loc] += 2;
      	datas[loc + 1] += 2;
      	datas[loc + 2] += 2;
      }
      
      int find5(vector<int> datas, int start, int& loc)
      {
      	if (start >= 6)
      		return 0;
      	int min = 10;
      	int times = 0;
      	for (int i = start; i < 10; i++)
      	{
      		if (datas[i] < min)	min = datas[i];
      		if (min == 0)
      		{
      			min = 10;
      			times = 0;
      		}
      		else
      		{
      			times++;
      			if (times == 5)
      			{
      				loc = i - 4;
      				return min;
      			}
      		}
      	}
      	return 0;
      }
      void sub5(vector<int>& datas, int loc,int times)
      {
      	datas[loc] -= times;
      	datas[loc + 1] -= times;
      	datas[loc + 2] -= times;
      	datas[loc + 3] -= times;
      	datas[loc + 4] -= times;
      }
      
      void add5(vector<int>& datas, int loc) {
      	datas[loc] += 1;
      	datas[loc + 1] += 1;
      	datas[loc + 2] += 1;
      	datas[loc + 3] += 1;
      	datas[loc + 4] += 1;
      }
      
      
      void dfs(vector<int>& datas, int& min, int cur, int step,int start)
      {
      	int loc = 0;
      	if (step == 0)
      	{
      		if (start >= 8)
      		{
      			dfs(datas,min, cur, 1, 0);
      		}
      		else
      		{
      			int nums = find6(datas, start, loc); //loc 是指的找到了并开始的地方
      			if (nums == 0)
      			{
      				dfs(datas, min, cur, 1, 0);
      			}
      			else
      			{
      				int n = nums;
      				sub6(datas, loc, nums);
      				while (n)
      				{
      					dfs(datas, min, cur + n, 0, loc + 1);
      					add6(datas, loc);
      					n--;
      				}
      				dfs(datas, min, cur, 0, loc + 3);
      			}
      		}
      	}
      	else if (step == 1)
      	{
      		if (start >= 6)
      		{
      			dfs(datas, min, cur, 2, 0);
      		}
      		else
      		{
      			int nums = find5(datas, start, loc); //loc 是指的找到了并开始的地方
      
      			if (nums == 0)
      			{
      				dfs(datas, min, cur, 2, 0);
      			}
      			else
      			{
      				int n = nums;
      				sub5(datas, loc, nums);
      				while (n)
      				{
      					dfs(datas, min, cur + n, 1, loc + 1);
      					add5(datas, loc);
      					n--;
      				}
      				dfs(datas, min, cur, 1, loc + 5);
      			}
      		}
      	}
      	else
      	{
      		int nums = 0;
      		for (int i = 0; i < 10; i++)
      		{
      			if (datas[i] > 0 && datas[i] <= 2)
      			{
      				nums++;
      			}
      			else if (datas[i] > 2 && datas[i] <= 4)
      			{
      				nums += 2;
      			}
      		}
      		cur += nums;
      		if (min > cur)
      			min = cur;
      	}
      }
      
      int main()
      {
      	vector<int>  datas(10);
      	for (int i = 0; i < 10; i++)
      	{
      		cin >> datas[i];
      	}
      	int min = 50;
      	dfs(datas,min,0,0,0);
      	cout << min;
      }
      
  • 相关阅读:
    Linux搭建JAVAWEB环境
    java异常捕获
    java流2
    java流
    32
    java代码List
    java代码输入流篇2
    java流类练习前篇
    java流网址:
    java中i/o练习
  • 原文地址:https://www.cnblogs.com/hustyan/p/12531879.html
Copyright © 2011-2022 走看看