當前位置:才華齋>IT認證>華為認證>

2016年華為上機考試題

華為認證 閱讀(3.14W)

本文為大家分享的是2016最新的華為認證上機模擬考試題,希望對大家的複習有所幫助!

2016年華為上機考試題

1 (1) 字母大小寫反轉

這到題沒什麼可說的,只是我很久沒寫這樣要IO輸入輸出的程式碼,當時看到華為的提示紙條上寫著“只能使用stdin方式輸入”,還愣了一會:一定是我開啟方式不對,什麼時候有了一個stdin的輸入函式?難道我又學藝不精了……後面才反應過來,直接按英文字面意思理解為“只能使用標準輸入方式”就好了。好了,言歸正傳,回到這道題,至少可以用以下兩種方式:

C++ STL庫string中 有 isupper , islower , toupper ,tolower 函式

通過 +/- ('a'-'A'+0)

(2) n個人圍成一圈,從第1個人開始報數,每報到第m個人,則其出局,求最後出局的人的初始序號。

第1種方法,我當時是用了個狀態表來記錄這人有沒有出局,沒出局則報數計數器加1並玩下走,碰到第m個報數號則更新狀態為已出局,碰到隊伍最末則重新移動到隊首。

#include

#define N 4

#define M 3

using namespace std;

int *man = NULL;

int JosephusSol_statusTab(int n,int m)

{

int sn=0 , pos = 0 ,loop_pos=0;

do

{

if( man[pos] == 0 ){//此人未出局

loop_pos++;

if(loop_pos == m){//找到一輪報數的出局者

sn++;

man[pos] = sn ; // 標記出局序號

loop_pos = 0;

}

}

pos ++ ;

if(pos==n)

pos = 0;

}while(sn!=n);

return pos;

}

int main()

{

int sn=0 , pos = 0 ,loop_pos=0;

man = new int [N];

for(int i=0;i

man[i] = 0;

pos = JosephusSol_statusTab(N,M);

cout << pos <

if(man != 0)

delete [] man;

return 0;

}

第2種方法是雙向連結串列,技術面面試的時候,面試官就考了我這一題,在紙上快速寫程式碼的能力還是有所欠缺。

第3種方法是遞迴,

第0次報數(即初始排列狀態)如下:

1

2

……

n

第1次報數到m,剔除後的序列為:

m+1

m+2

n

1

2

m-1

重新編號的話為:

1

2

n-m

n-m+1

n-m+2

n-1

設f(n,m)為n個人的隊伍,剔除報數人m,最後留下的人的'序號;f(n-1,m)為n-1個人的隊伍,剔除報數人m,最後留下的人的序號。則有:

考慮到第1次報數後的序列號n的情況,可得到統一的公式為:

這就是這個問題的一個遞迴公式,實現程式碼如下:

#include < iostream >

using namespace std;

int JosephusSol_mathRecursion( int n, int m)

{

if (n == 1 )

return 1 ;

else

return (JosephusSol_mathRecursion(n - 1 ,m) + m - 1 ) % n + 1 ;

}

int main()

{

cout << JosephusSol_mathRecursion( 4 , 3 ) << endl ;

return 0 ;

}

3.兩段長度為1-5000變換的單詞word1,word2,設計一個字母權重分配方案:該方案中不區分大小寫字母;該方案A-Z的字母唯一對應一個1-26的數;該方案滿足word1的字母權重和與word2的字母權重和的差值最大 。

這個問題是實質是比較單詞,剔除相同的部分,看哪個剩餘部分多,剩餘多的單詞部分再進行一個字母頻率從大到小排列,頻率最高的給最大的權重——26,頻率低一些的依次給剩餘的最大權重;剩餘的單詞部分再進行一個字母頻率也是從大到小排列,只不過頻率最高的給最小的權重——1,頻率高一些的依次給剩餘的最小權重。

至於實現,若是先直接比較單詞,再字母頻率統計,工作量有點大。可以考慮直接用 字母表A-Z為索引,將單詞裝換為字母表A-Z的編碼(更形象點,即將雜亂的單詞變成一個26進位制數,當然這樣沒有包含單詞的全部資訊——字母在單詞中的排序就不知道,所以可以裝換成26個節點,每個節點還含有一個排序陣列,如單詞daddy,相對應的d節點下就含有一個size為3的陣列,有sn['d'][3]={0,2,3}。當然本題只需要一個量就是size['d']=3。)

#include

#include

#include

using namespace std;

int main()

{

string str1("mother"),str2("father");

// string str1,str2;

// cin >> str1 >> str2;

size_t i = 0 ,j =0;

vector status1(26,0);

vector status2(26,0);

vector diff(26,0);

vector negative(26,0);

vector positive(26,0);

int cntNeg = 0 , cntPos = 0;

for( i = 0; i< (); i++)

{

char c = str1[i];

if( 'a'<=c && c <= 'z' ){

status1[c -'a' + 0]++;

}

if( 'A'<=str1[i] && str1[i] <= 'Z' ){

status1[c-'A'+ 0]++;

}

}

for( i = 0; i< (); i++)

{

char c = str2[i];

if( 'a'<=str2[i] && str2[i] <= 'z' ){

status2[c -'a' + 0]++;

}

if( 'A'<=str2[i] && str2[i] <= 'Z' ){

status2[c -'A' + 0]++;

}

}

for( i = 0; i< 26; i++){

diff[i] = status2[i] - status1[i];

if(diff[i]<0)

{

negative[i] = -diff[i];

cntNeg += negative[i];

}

else

{

positive[i] = diff[i];

cntPos += positive[i];

}

}

for( i = 0; i< 26; i++)

cout << ' '<< status1[i] <<' '<< status2[i] <<' '<< diff[i] << endl;

int tmp= 0;

int a[26],b[26];

cout << ' '<< cntNeg <<' '<< cntPos;

for( i = 0 ; i < 26;i++ )

{

a[i] = 26-i;

b[i] = i+1;

}

for( i = 0 ; i < 26;i++ )

for(j = i+1 ;j <26;j++)

{

if( negative[i] < negative[j] ){

tmp = negative[i];

negative[i] = negative[j];

negative[j] = tmp;

}

}

for( i = 0 ; i < 26;i++ )

for(j = i+1 ;j <26;j++)

{

if( positive[i] < positive[j] ){

tmp = positive[i];

positive[i] = positive[j];

positive[j] = tmp;

}

}

int out=0 , large = 0, small =0 ;

for( i = 0 ; i < 26;i++ )

{

if( cntNeg >= cntPos ) {

large += a[i]*negative[i];

small += b[i]*positive[i];

}

else{

large += a[i]*positive[i];

small += b[i]*negative[i];

}

}

out = large - small;

cout << out ;

return 0;

}

2.華為2013年在長沙的一個機試題是判斷潤年。年份要求是四位數。

輸入樣例:

2012

2122

afdsfa

22.33

輸出樣例:

YES

NO

ERROR

我的答案是:

Java程式碼 收藏程式碼

package iam;

import onEvent;

import onListener;

import me;

import el;

import tField;

public class Test extends JFrame{

private JLabel lable;

private JTextField field;

public static void main(String[] args){

Test frame = new Test();

();

}

public void init(){

ize(400, 250);

ayout(null);

lable = new JLabel("請輸入年份:");

field = new JTextField();

ounds(140, 90, 120, 30);

ounds(140, 120,120, 30);

(field);

(lable);

isible(true);

ctionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

String year = ext()ring();

if(th() != 4){

tln("ERROR");

return;

}

int y = 0;

try{

y = eInt(year);

}catch(Exception ex){

tln("ERROR");

return;

}

check(y);

}

});

}

private void check(int year){

if(year == 0){

tln("ERROR");

return;

}

if(year % 100 == 0){

if(year % 400 == 0){

tln("YES");

}else{

tln("NO");

}

}else{

if(year % 4 == 0){

tln("YES");

}else{

tln("NO");

}

}

}

}