ios面接アルゴリズム問題(5)——トランプカード、最小と差の問題、V字図形印刷


今日は皆さんにいくつかの面白いアルゴリズムを紹介します.最適化はあまりよくありません.考えのある皆さん、交流してください.
1、プログラムシミュレーション52枚のカードをランダムに4人のプレイヤーに送信する(サイズ王を除く)
//
//  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
"); }else if(i==13) { printf("
2
"); }else if (i==26) { printf("
3
"); }else if (i==39) { printf("
4
"); } 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("      (   ):
"); // length=inputAndLength(str); // , , while (length%2==0) { printf(" ! :
"); 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("
"); } return 0; } int inputAndLength(char str[]) { int i=0; do{ scanf("%c",&str[i]); // if (str[i]=='
') { 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
%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
",sum); int sub=sum-avg; if (sub<0) { sub=-sub;// } if (sub<temp) { temp=sub; result=sum; } //printf(" :%d
",result); //return result; } } return result; }