廣州百田 技術類 筆試題

1、其中一道題是輸入一組十六進制數,其中大寫字母ABCDEF,數字“1~9”,字符串類型爲string。其中把十六進制數轉化爲二進制數。比如“3A”。輸出結果爲00111010。題目不難,可惜因爲字符串類型爲string,當時一時寫代碼時產生諸多錯誤。索性這次將string字符串與char字符做一個總結。

#include <string> 
#include <sstream> 
using namespace std; 
#include "IntToString.h" 
string StingToBin(string s) 
{ 
          string Sbin             /*(s.length())*/; 
      Sbin.resize(200);       //因爲是String類型,所以需要用這個函數開闢空間大小 
          int  k = 1;              
      for(int i=0;i < s.length();i++) 
      { 
               if(s[i]>'0'&&s[i]<'9')    
           {  
                 int q = int(s[i])-48;         //s[i]爲char類型,int類型強轉之後是ASCII碼。所以要減去48,將char型的數字轉化爲int型的數字 
             int p = 1;                    //p值用於定位,因爲一個16進制對應4個二進制數值 
             while(q/2+1&&p<=4)       
             {  
                           Sbin[4*k-p] = char(q%2+48);  //k值用於表示是第幾個十六進制值,加上48同樣是將int型的數字轉化爲char型的數字 
               q = q/2;                     //轉化爲二進制 
               p++;                          
             } 
               
           } 
         else                                   //考慮到十六進制的“A"~"F" 
         {  
           switch(s[i]-'A') 
           { 
           case 0:  memcpy(&Sbin[4*k-4],"1010",4);break;   
                   case 1:  memcpy(&Sbin[4*k-4],"1011",4);break; 
           case 2:  memcpy(&Sbin[4*k-4],"1100",4);break; 
           case 3:  memcpy(&Sbin[4*k-4],"1101",4);break; 
           case 4:  memcpy(&Sbin[4*k-4],"1110",4);break; 
           case 5:  memcpy(&Sbin[4*k-4],"1111",4);break; 
           } 
         } 
           k++; 
      } 
          /*Sbin[s.length()] = '\0';*/
      return Sbin; 
} 


 

2、題目是這樣的:有n張撲克牌,每張牌的取值範圍是:2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13),A(14)。(同樣的牌的數目不超過4張)。可以出對子,三張一樣的,四張一樣的或者順子,怎樣出最後剩下的單牌最少。

思路:首先考慮找出順子。我的思路其實很簡單,首先就是要去掉重複的牌,因爲同樣的順子之算一個,顯然JAVA中的Set很適合這個工作。同時又需要對這些牌進行排序,毫無疑問就是TreeSet了。然後從小到大遍歷這些牌,並設置一個計數器count。若發現連續的牌,則count++;若發現不連續的,分2中情況:若count>4,則找到了一個順子,存起來;反之則什麼都不做。然後count=1,從新開始找順子。下面就是代碼:

import java.util.ArrayList;
import java.util.TreeSet;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String[] cards = {“6″, ”2″ ,”3″ ,”7″ ,”4″, ”5″, ”8″, ”8″, ”10″, ”10″, ”10″, ”J”, ”K”, ”Q”, ”A”};
        TreeSet<Integer> set = init(cards);    //將字符串表示的撲克牌轉換爲數字,便於處理
        ArrayList<String> result = check(set);    //找出順子
        printResult(result);    //打印順子
        System.out.println(“程序結束!!”);
    }

    private static TreeSet<Integer> init(String[] cards) {
        TreeSet<Integer> set = new TreeSet<Integer>();
        for(String s:cards) {
            if(s.charAt(0)>=’1′&&s.charAt(0)<=’9′) {
                set.add(Integer.parseInt(s));
            }else {
                switch(s.toUpperCase().charAt(0)) {
                case ’J':
                    set.add(11);    break;
                case ’Q':
                    set.add(12);    break;
                case ’K':
                    set.add(13);    break;
                case ’A':
                    set.add(14);    break;
                }
            }
        }
        return set;

    }

    private static ArrayList<String> check(TreeSet<Integer> set) {
        ArrayList<String> result = new ArrayList<String>();
        StringBuilder temp = new StringBuilder();
        int count = 0;
        Integer[] nums = new Integer[1];
        nums = set.toArray(nums);
        int begin = 0;
        for(Integer i:set) {
            if(count == 0) {
                begin = i;
                count++;
                temp.append(numToCard(begin));
            }else if(i == begin+count) {
                temp.append(“, ”+numToCard(i));
                count++;
            }else {
                if(count>4) {
                    result.add(temp.toString());
                }
                begin = i;
                temp.replace(0, temp.length(), numToCard(i)+”");
                count = 1;
            }
        }

        if(count>4)        result.add(temp.toString());
        return result;
    }

    private static String numToCard(int x) {
        if(x>10) {
            switch(x) {
            case 11:
                return ”J”;
            case 12:
                return ”Q”;
            case 13:
                return ”K”;
            case 14:
                return ”A”;
            }
        }else {
            return x+”";
        }
        return null;
    }

                     //可以將長順子分解爲短順子的打印模式
    private static void printResult1(ArrayList<String> result) {

        int count = 0;
        String[] nodes = null;
        if(result.size() == 0) {
            System.out.println(“沒有順子!!”);
        }else {
            for(String s:result) {
                nodes = s.split(“,”);
                count += (1+(nodes.length-4))*(nodes.length-4)/2;
            }
            System.out.println(“共有”+count+”個順子:”);
            for(String s:result) {
                nodes = s.split(“,”);
                for(int i=5; i<=nodes.length; i++)
                    for(int j=0; i-j>4; j++) {
                        System.out.print(nodes[j].trim());
                        for(int x = j+1; x<i; x++) {
                            System.out.print(“,” + nodes[x]);
                        }
                        System.out.println();
                    }
            }
        }
    }

                     //不將長順子進行分解的打印模式
    private static void printResult2(ArrayList<String> result) {
        if(result.size() == 0) {
            System.out.println(“沒有順子!!”);
        }else {
            System.out.println(“共有”+result.size()+”個順子:”);
            for(String s:result) {
                System.out.println(s);
            }
        }
    }

3、輸入一串由字符0和1組成的二進制數字符串,編寫函數String hexFromBin(String s),返回其十六進制數字符串表示。

例如:binFromHex("111010")返回“3A”

 

 

 

 

 


 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章