搜狐笔试编程题(2016研发岗)

两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。游戏规则:共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) 如二人牌面相同,则为平局。
java代码实现:略繁琐
import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
public class Main{
     public static void main(String[] args){
         Scanner sc= new Scanner(System.in);
         while (sc.hasNext()){
             String str1=sc.next();
             String str2=sc.next();
               int [] car1= new int [ 3 ];
       int [] car2= new int [ 3 ];
       if (!content(str1,car1) || !content(str2,car2)){System.out.println(- 2 );}
       int car_a=type(car1);
       int car_b=type(car2);
       //不可能同时为相同的豹子
          if (car_a==car_b && car_a== 4 && car1[ 0 ]==car2[ 0 ]){System.out.println(- 2 );}
          
          //牌一样的情况
          if (car1[ 0 ]==car2[ 0 ] && car1[ 1 ]==car2[ 1 ] && car1[ 2 ]==car2[ 2 ]){
              System.out.println( 0 );
          }
          //牌不一样
          if (car_a==car_b){
              //都是豹子,比较大小
              if (car_a== 4 ){
                  if (car1[ 0 ]>car2[ 0 ]){
                      System.out.println( 1 );
                  } else {System.out.println(- 1 );}
              }
              //都是顺子
              else if (car_a== 3 ){
                 if (car1[ 2 ] > car2[ 2 ]) {
                     System.out.println( 1 );
                 else {
                     System.out.println(- 1 );
                 }
              }
              //都是对子
              else if (car_a== 2 ){
                  if (car1[ 1 ]>car2[ 1 ]){
                      System.out.println( 1 );
                  } else {
                      System.out.println(- 1 );
                  }
              }
              //都是普通牌
              else {
                  if (car1[ 2 ]>car2[ 2 ] ||
                          (car1[ 2 ]==car2[ 2 ] && car1[ 1 ]>car2[ 1 ]) ||
                          (car1[ 2 ]==car2[ 2 ] && car1[ 1 ]==car2[ 1 ] && car1[ 0 ]>car2[ 0 ])){
                      System.out.println( 1 );
                  } else {
                      System.out.println(- 1 );
                  }
                  
              }
              
          } else {
                //牌不一样
             System.out.println(car_a>car_b? 1 :- 1 );
          }
         }
     }
     public static int type( int [] car) {
     //豹子:返回4
     if (car[ 0 ]==car[ 1 ] && car[ 1 ]==car[ 2 ]){
         return 4 ;
     }
     //顺子:返回3
     if (car[ 0 ]+ 1 ==car[ 1 ] && car[ 1 ]+ 1 ==car[ 2 ]){
         return 3 ;
     }
     //对子:返回2
     if (car[ 0 ]==car[ 1 ] || car[ 1 ]==car[ 2 ]){
         return 2 ;
     }
     //其他
     return 1 ;
}
 
private static boolean content(String str, int [] car) {
     
     Map map= new HashMap();
     map.put( 'J' 11 );
     map.put( 'Q' 12 );
     map.put( 'K' 13 );
     map.put( 'A' 14 );
     int i= 0 ;
     int j= 0 ;
     char [] c=str.toCharArray();
     while (i
         if (map.containsKey(c[i])){
             car[j]=map.get(c[i]);
         }
         else if (c[i]>= '2' && c[i] <= '9' ){
             
             car[j]=c[i]- '0' ;
         } else if (c[i]== '1' && c[i+ 1 ]== '0' ){
             car[j]= 10 ;
             i++;
         } else { return false ;}
         i++;
         j++;
     }
     if (car.length!= 3 ){ return false ;}
     car=sort(car);
     return true ;
}
public static int [] sort( int [] car) {
         for ( int i= 0 ;i< 3 ;i++){
             for ( int j=i;j< 3 ;j++){
                 if (car[i]>car[j]){
                     int t=car[i];
                     car[i]=car[j];
                     car[j]=t;
                 }
             }
         }
       return car;
}
     
}

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

输入描述:
首先一个正整数N,表示人员个数。 之后N行,每行三个数,分别对应马戏团员编号,体重和身高。
输出描述:
正整数m,表示罗汉塔的高度。
输入例子:
6
1 65 100
2 75 80
3 80 100
4 60 95
5 82 101
6 81 70

输出例子:
4

解题思路;
和上面的最长递增子序列算法原型相同,只是增加了对体重的排序。
package com.chen.souhu;

import java.util.Scanner;

public class Main {
static class Person {
int num;
int high;
int weight;
int dp;//表示已该人为第一个罗汉的情况下,可以叠几个。
int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getHigh() {
return high;
}
public void setHigh(int high) {
this.high = high;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getDp() {
return dp;
}
public void setDp(int dp) {
this.dp = dp;
}

}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
Person map[] = new Person[n];
for (int i = 0; i < n; i++) {
map[i] = new Person();
map[i].setNum(sc.nextInt());
map[i].setWeight(sc.nextInt());
map[i].setHigh(sc.nextInt());
}
sort(map);
int maxH = getRes(map, n);
System.out.println(maxH);

}
}
public static void sort(Person[] map){
// 根据体重排序
for (int i = 0; i < map.length; i++) {
for (int j = i; j > 0; j--) {
if (map[j].getWeight() < map[j - 1].getWeight()) {
Person p=map[j];
map[j]=map[j-1];
map[j-1]=p;
}
// 如果体重相同,身高矮的在后面
else if (map[j].getWeight() == map[j - 1].getWeight()
&& map[j].getHigh() > map[j - 1].getHigh()) {
Person p=map[j];
map[j]=map[j-1];
map[j-1]=p;
} else {
break;
}
}
}
}
//根据体重排序,然后根据身高求dp
public static int getRes(Person[] map, int n) {
int dp = 0;
for (int i = 0; i < n; i++) {
map[i].setDp(1);
for (int j = 0; j < i; j++) {
if (map[i].getHigh() >= map[j].getHigh() && map[i].getDp() < map[j].getDp() + 1) {
map[i].setDp(map[j].getDp() + 1);
}
}
dp = Math.max(dp, map[i].getDp());
}
return dp;
}
}
狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。

输入描述:
每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。


输出描述:
输出至少需要多少w的奖金
输入例子:
1020 32 12 32 45 11 21 31 41 33

输出例子:
20
import java.util.Scanner;
public class Main{
     public static void main(String[] args){
         Scanner sc= new Scanner(System.in);
         while (sc.hasNext()){
             int n=sc.nextInt();
             if (n<= 0 ){System.out.println( 0 );}
             int [] a= new int [n];
             for ( int i= 0 ;i
                 a[i]=sc.nextInt();
             }
             System.out.println(getRes(n,a));
         }
     }
     private static int getRes( int n,  int [] a) {
      if (n<= 0 ){ return 0 ;}
         if (a.length!=n){ return 0 ;}
         int [] res= new int [n];
         int i= 1 ;
         int j=n- 2 ;
          while (i
             if (a[i] > a[i -  1 ]){
                 res[i] = res[i -  1 ] +  1 ;
             }
                 
             i++;
         }
         while (j >=  0 ) {
             
         if (a[j] > a[j+ 1 ] && res[j] 1 ]+ 1 ){
                 res[j] = res[j+ 1 ] +  1 ;
         }
             j--;
         }
         int count= 0 ;
        for ( int k= 0 ;k
         count+=res[k];
        }
       return count+n; 
}
}

你可能感兴趣的:(算法)