ios面试算法题(5)——扑克发牌、最小和差问题、V字图形打印

来源:互联网 发布:ios8.4.1完美越狱mac 编辑:程序博客网 时间:2024/06/06 13:19

今天给大家介绍几种有意思的算法,优化并不是很好,有想法的大家多多交流交流


1、程序模拟将52张牌随机发送给四个玩家(大小王除外)

////  main.c//  randPoke////  Created by cuixuerui on 15/12/24.//  Copyright (c) 2015年 cuixuerui. All rights reserved.//#include <stdio.h>#include <time.h>#include <stdlib.h>typedef struct{    int colo;    int num;} POKE;char *color[4]={"♠️","♣️","♥️","♦️"};char *num[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};int main(int argc, const char * argv[]) {    srand((int)time(NULL));        POKE poke[52];        for(int c=0;c<52;c++)    {        //首先初始化,将所有的牌赋上不相关的值        poke[c].num=14;        poke[c].colo=5;    }    /*     思想:将0-51分成四段          玩家1:0-12     玩家2:13-25     玩家3:26-38     玩家4:39-51          给每个玩家随机发牌,然后判断0-52中有没有重复的牌,没有则发牌,有则重新产生随机数      */    int count=0;    int j=0;    int k=0;        while (count<=51) {        int num=rand()%13;//随机发牌        int color=rand()%4;        int flag=0;   //重牌标志        for (int i=0; i<52; i++) {            if (poke[i].colo==color&&poke[i].num==num) {                flag=1;  //有重牌            }        }        if (flag==0) {//如果没有重牌的话            poke[j].colo=color;            poke[j].num=num;            j=j+13;//转到第二个玩家            count++;//总的牌数            if (j>39+k) {//第一轮发牌完毕,开始第二轮发牌                k++;                j=k;            }        }     }        for (int i=0; i<52; i++) {        if (i==0) {            printf("玩家1\n");        }else if(i==13)        {            printf("\n玩家2\n");         }else if (i==26)        {            printf("\n玩家3\n");        }else if (i==39)        {            printf("\n玩家4\n");        }       printf("%s%s ",color[poke[i].colo],num[poke[i].num]);    }    return 0;}

第二、传入奇数字符,打印V字图形

////  main.c//  第五题////  Created by qianfeng on 15/12/8.//  Copyright (c) 2015年 cuixuerui. All rights reserved.//#include <stdio.h>/*5.实现函数,传入奇数字符的字符串,打印图形。(15分)传入:"abcdefg"打印: a     g  b   f   c e    d*/int inputAndLength(char str[]);int main(int argc, const char * argv[]) {        char str[20];    //int i=0;    int length;        printf("请输入字符串(奇数个):\n");            //获取长度    length=inputAndLength(str);    //判断是否是奇数字符,如果不是奇数字符,重新输入    while (length%2==0)    {        printf("输入错误!请输入奇数个字符:\n");        length=inputAndLength(str);    }        //length/2+1表示输入的层数,7个字符只需要输入4层就够了    for(int i=0; i<length/2+1; i++) {                //字母前边的空格        for (int j=0; j<=i-1; j++) {            printf(" ");        }        //输出前边字母        printf("%c",str[i]);                /*         //输出两个字母中间的空格         //(length-2)-2*i表示空格与字母位置的关系         比如:length=7         str[0]-----5个空格         str[1]-----3个空格         str[2]-----1个空格         */        for (int j=(length-2)-2*i; j>0;j--) {            printf(" ");        }        //输出后边的字母        if (i!=length/2) {            printf("%c",str[length-i-1]);        }        //输出最后边换行        printf("\n");    }        return 0;}int inputAndLength(char str[]){    int i=0;    do{        scanf("%c",&str[i]);        //如果结尾是回车则退出循环        if (str[i]=='\n') {            break;        }        i++;    }while(1);    return i;}

3、拔河比赛的规矩把所有人分成A B两队,力气大的一方胜出
 由于一开始不知道每个人力量多大,所以主持人分组定下如下策略:
 根据每个人的体重尽可能的分配平均
 分配的策略是:
 1. A B两队人数相差 <= 1
 2. A B两队人总量之差绝对值最小
 
 ==============
 比如某班级有N(可为奇数或者偶数)个人, 编号为0, 1, 2, ... (N-1)
 每个人都有自身的体重,
 比如
 W0, W1, W2, ... W(N-1)
 请问如何分配比赛两队的人数,保证双方人体重总和相差最小
 打印出 A B两队的总体重(从小到大)
 
 比如: 有7个人, 体重分别为
 100 90 200 220 130 120 110
 
 输出为(先输出体重小的):
 470
 500
 
 请设计一个程序,根据人数自动来进行统计
 注意输入的时候 第一个是输入的人个数,比如7个人
 后续输入的是7个人的体重
  7 100 90 200 220 130 120 110


据说用平衡二叉树可以做,我想投个懒,就用递归穷举法捣鼓了捣鼓(不要笑我)

////  main.c//  划分最小和差问题(拔河分配问题)////  Created by qianfeng on 15/12/15.//  Copyright (c) 2015年 cuixuerui. All rights reserved.//#include <stdio.h>#define MAX_SIZE 125/*  拔河比赛的规矩把所有人分成A B两队,力气大的一方胜出 由于一开始不知道每个人力量多大,所以主持人分组定下如下策略: 根据每个人的体重尽可能的分配平均 分配的策略是: 1. A B两队人数相差 <= 1 2. A B两队人总量之差绝对值最小  ============== 比如某班级有N(可为奇数或者偶数)个人, 编号为0, 1, 2, ... (N-1) 每个人都有自身的体重, 比如 W0, W1, W2, ... W(N-1) 请问如何分配比赛两队的人数,保证双方人体重总和相差最小 打印出 A B两队的总体重(从小到大)  比如: 有7个人, 体重分别为 100 90 200 220 130 120 110  输出为(先输出体重小的): 470 500  请设计一个程序,根据人数自动来进行统计 注意输入的时候 第一个是输入的人个数,比如7个人 后续输入的是7个人的体重  7 100 90 200 220 130 120 110 */int addNum(int num[],int m,int k);float avg;int a[100],end;int temp;int result=0;int main(int argc, const char * argv[]) {        int sum=0;    int weight[20];    weight[0]=2;    for (int i=0; i<=weight[0]; i++) {        scanf("%d",&weight[i]);    }    int length=weight[0];    //求和    for(int i=1;i<=length;i++)    {        sum=sum+weight[i];//sum为数列的总和    }        avg=sum/2;    end=length/2;    temp=avg;    int num1=addNum(weight, length, end);    int num2=sum-num1;    int min=num1<num2?num1:num2;    printf("%d\n%d",min,sum-min);            return 0;   }/* 取出数组num[]中任意的k个数相加,求和  */int addNum(int num[],int m,int k){    int i,j;    int sum=0;        for(i=m;i>=k;i--)    {        a[k]=num[i];//最后一个位置的元素可以取m,m-1,m-2.....k        if(k>1) addNum(num,i-1,k-1);//递归调用        else        {            sum=0;            for(j=1;j<=end;j++)            {                sum=sum+a[j];                            }            //printf("%d \n",sum);                        int sub=sum-avg;            if (sub<0) {                sub=-sub;//取差值的绝对值            }            if (sub<temp) {                temp=sub;                result=sum;            }            //printf("结果是:%d\n",result);            //return result;        }    }    return result;}


 

1 0