搜狐2016研发工程师编程题

1、[编程题]马戏团

搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。 现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。

输入描述:
首先一个正整数N,表示人员个数。
之后N行,每行三个数,分别对应马戏团员编号,体重和身高。
输出描述:
正整数m,表示罗汉塔的高度。
输入例子:
61 65 1002 75 803 80 1004 60 955 82 1016 81 70
输出例子:
4代码如下:

2、[编程题]扎金花

两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。

游戏规则:
共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 

对于牌型的规则如下:
1.三张牌一样即为豹子
2.三张牌相连为顺子(A23不算顺子)
3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。 
输入描述:
输入两个字符串代表两个玩家的牌(如"10KQ" "354"),先输入的作为玩家1,后输入的作为玩家2
输出描述:
1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入
输入例子:
KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A
输出例子:
1
1
-1
-1
1
1
-1代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std ;

vector<int> trans( string s){
    vector<int> vec;
    for ( int i= 0 ; i<s. size (); i++) {
        if (s[ i ]== ‘1‘ ) {
            vec. push_back ( 10 ); //1和0是一个整体
            i++;
        }
        if (s[ i ]== ‘J‘ ) vec. push_back ( 11 );
        else if (s[ i ]== ‘Q‘ ) vec. push_back ( 12 );
        else if (s[ i ]== ‘K‘ ) vec. push_back ( 13 );
        else if (s[ i ]== ‘A‘ ) vec. push_back ( 14 );
        else {
           int a=( int )(s[ i ]- ‘0‘ );
           vec. push_back (a);
        }
    }
    sort (vec. begin (), vec. end ());
    return vec;
}

int pmtype( vector < int > vec){
    if (vec[ 0 ]==vec[ 1 ]&&vec[ 1 ]==vec[ 2 ]) {
        return 3 ;  // 豹子
    }
    if ((vec[ 0 ]+ 1 ==vec[ 1 ])&&(vec[ 1 ]+ 1 ==vec[ 2 ])) {
        return 2 ; // 顺子
    }
    if (vec[ 0 ]!=vec[ 1 ]&&vec[ 0 ]!=vec[ 2 ]&&vec[ 1 ]!=vec[ 2 ]) {
        return 0 ; // 普通牌型即单牌
    }
    return 1 ; // 对子
}

int main(){
    string s1,s2;
    while ( cin >>s1>>s2) {
        vector < int > vec1= trans (s1);
        vector < int > vec2= trans (s2);
        int pmtype1= pmtype (vec1);
        int pmtype2= pmtype (vec2);
        if (pmtype1>pmtype2) {
            cout << 1 << endl ;
        }
        if (pmtype1<pmtype2) {
            cout <<- 1 << endl ;
        }
        if (pmtype1== 3 &&pmtype2== 3 ) {
            if (vec1[ 0 ]>vec2[ 0 ]) {
                cout << 1 << endl ;
            }
            if (vec1[ 0 ]==vec2[ 0 ]) {  //不合理情况
                cout << 2 << endl ;
            }
            else cout <<- 1 << endl ;
        }
        if (pmtype1== 2 && pmtype2== 2 ) {
            if (vec1[ 0 ]>vec2[ 0 ]) { cout << 1 << endl ;}
            if (vec1[ 0 ]==vec2[ 0 ]) { cout << 0 << endl ;}
            else cout <<- 1 << endl ;
        }
        if (pmtype1== 1 &&pmtype2== 1 ) {
            int a,b;
            if (vec1[ 0 ]==vec1[ 1 ]) { a=vec1[ 0 ];}
            else {a=vec1[ 1 ];}
            if (vec2[ 0 ]==vec2[ 1 ]) { b=vec2[ 0 ];}
            else {b=vec2[ 1 ];}
            if (a==b) {
                int c,d;
                if (a==vec1[ 0 ]) {
                    c=vec1[ 2 ];
                }
                else c=vec1[ 0 ];
                if (b==vec2[ 0 ]) {
                    d=vec2[ 2 ];
                }
                else d=vec2[ 0 ];
                if (c>d) {
                    cout << 1 << endl ;
                } if (c<d) {
                   cout <<- 1 << endl ;
                } else cout << 0 << endl ;
            }
            if (a>b) {
                cout << 1 << endl ;
            }
            else {
                cout <<- 1 << endl ;
            }
        }
        if (pmtype1== 0 &&pmtype2== 0 ) {
            if (vec1[ 2 ]!=vec2[ 2 ]) {
                if (vec1[ 2 ]>vec2[ 2 ]) {
                   cout << 1 << endl ;
                    continue ;
                } else {
                   cout <<- 1 << endl ;
                   continue ;
                }
            }
            if (vec1[ 1 ]!=vec2[ 1 ]) {
                if (vec1[ 1 ]>vec2[ 1 ]) {
                    cout << 1 << endl ;
                    continue ;
                } else {
                    cout <<- 1 << endl ;
                    continue ;
                }
            }
            if (vec1[ 0 ]!=vec2[ 0 ]) {
                if (vec1[ 0 ]>vec2[ 0 ]) {
                    cout << 1 << endl ;
                    continue ;
                }
                if (vec1[ 0 ]<vec2[ 0 ]) {
                    cout <<- 1 << endl ;
                    continue ;
                }
            }
            cout << 0 << endl ;
        }
    }
    return 0 ;
}

运行结果:(http://www.anycodes.cn/zh/     在线编程网站运行)

这个答案还是有错误的,待改进!!

3、[编程题]发奖金  

狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。 
输入描述:
每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。
输出描述:
输出至少需要多少w的奖金
输入例子:
10
20
32
12
32
45
11
21
31
41
33
输出例子:
20

代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int N;
    while(cin>>N)
    {
      vector<int> chengji(N);
      for(int i=0;i<N;i++)
          cin>>chengji[i];
      vector<int> money(N,1);
      //由于每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩
      //从前往后(正向),第一个初始化为 1W ,依次往后初始化 i +1 的 money 值:
      //1、当 i 对应的成绩比 i+1 的成绩低时, i+1 应该拿到更多的前,所以有 money[i+1]=money[i]+1;
      //2、当 i 对应的成绩跟 i+1 相等时,反正也看不到,将 money[i+1] 设为 1 ;
      //3、当 i 对应的成绩比 i +1 高时,money[i+1] 应该是此时较小的,将其设为 1 ,对于这种下降的情况,可以采用反向循环更新
      //的方法
      for(int i=1;i<N;i++)
      {//正向
         if(chengji[i]>chengji[i-1])
             money[i]=money[i-1]+1;
          else if(chengji[i]==chengji[i-1])
             money[i]=money[i-1];
      }
      for(int i=N-2;i>=0;i--)
      {//反向
          if(chengji[i]>chengji[i+1])
              money[i]=max(money[i],money[i+1]+1);
      }
      int result=0;
      for(int i=0;i<N;i++)
          result+=money[i];
       cout<<result<<endl;
    }
    return 0;
}

  

时间: 2024-10-22 20:32:22

搜狐2016研发工程师编程题的相关文章

华为2016研发工程师编程题:字符集合

字符集合 输入一个字符串,求出该字符串包含的字符集合 输入描述: 每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写. 输出描述: 每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出. 输入例子: abcqweracb 输出例子: abcqwer 解题 标记法时间复杂度太差了,可以用HashMap增加了空间复杂度 我的标记法 import java.util.Scanner; public class Main{ public s

网易2016研发工程师编程题:路灯

路灯 一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要是这个d最小,请找到这个最小的d. 输入描述: 每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0).第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点. 输出描述: 输出答案,保留两位小数. 输入例子: 7 1515 5 3 7 9 14 0

网易2016研发工程师编程题:扫描透镜

扫描透镜 在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇? 输入描述: 第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小; 接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了

求职 | 华为研发工程师编程题个人题解【C++】【Python】

华为研发工程师编程题[C++][Python][数学][数组][字符串] 问题1 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述: 输入文件最多包

网易2016实习研发工程师编程题

牛客网上的题 1 比较重量 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入

比较重量 网易2016实习研发工程师编程题

题目: 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第 二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合 法,不

网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i

寻找第K大 网易2016实习研发工程师编程题

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 投机取巧能通过: 1 class Finder { 2 public: 3 int findKth(vector<int> a, int n, int K) { 4 // write code here 5 sort(a.begin(), a.end()); 6 return

网易2016 实习研发工程师 [编程题]二叉树

传送门 有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. 题解: 给每个节点编号(0 - total),用map记录每个节点的父节点 找出最大权值叶子节点 和 最小权值 叶子节点的编号 然后就是寻找最近公共祖先了 1 /* 2 struct TreeNode { 3 int val; 4 struct Tree