您的位置:首页 > 其它

2014年华为7月校招(提前批)的一些题目

2014-08-21 14:21 260 查看
这是华为7月校招(提前批)的一些题目,没有给函数接口,从主函数开始编。每人三道题,机试时间两小时。60分的是第一题,100分的是第二题,160分的是第三题。 

1、描述:

实现简易字符串压缩算法:一个长度最大为128的字符串,由字母a-z或者A-Z组成,将其中连续出现2次以上(含2次)的字母转换为字母和出现次数,以达到压缩目的。 

运行时间限制: 无限制 

内存限制: 无限制 

输入:

输入字符串,最大长度128 

输出:

输入字符串 

样例输入: AAAABBBB 

样例输出: A4B4 

答案提示:   

//2014-8-21 调试通过

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define M 128

int main(void)

{

 char str[M],out[M];

 int i=0, j=0, tmp=0;

 while( (str[i++] = getchar()) != '\n')

 {

 // printf("%d", i);

  if(i > 1)

  {

   if(str[i-1] == str[i-2])

    tmp++;

   else

   {

    out[j++] = str[i-2];

    out[j++] = tmp+1+48;

    tmp = 0;

   }

  }

 }

//处理'\n'前面的最后一种字符

 if(i > 1)

 {

  if(str[i-1] == str[i-2])

   {

    out[j++] = str[i-1];

    out[j++] = tmp +1+48;

    tmp = 0;

   }

   else

   {

    out[j++] = str[i-2];

    out[j++] = tmp +1+48;

    tmp = 0;

    out[j++] = str[i-1];

    out[j++] = tmp +1+48;

    tmp = 0;

   }

 }

 

 for(i=0; i<j-1; i++)

 {

  printf("%c", out[i]);

 }

 printf("\n");

 system("pause");

 return 0;

}

2、竞赛积分猜想 描述:

某公司举办了知识竞赛。题目的计分规则如下: 1.每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前得到的分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 2.每位选手都有一个起步的分数为10分。? 

程序要求:

如果某获胜选手最终得分是X分,如果不让你看比赛过程,请推断出他(她)哪个题目答对了,哪个题目答错了吗?把答对的题目记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011?就是一种可能的情况,10道题目的编号从左到右依次排列。 

你的任务是算出满足该得分的所有可能情况,答案之间用|号分隔,并且答案需要进行排序,将答案转换为十进制后数字小的排在前面,即0010110011应该排在1010110011的前面。如果不存在满足该分数的情况,则输出10个0:0000000000 

运行时间限制: 无限制 

内存限制: 无限制 

输入:

选手的得分,正整数。 

输出:

满足输入得分的所有可能的情况,答案之间用|号分隔,并且答案需要进行排序,将答案转换为十进制后数字小的排在前面,即0010110011应该排在1010110011的前面。如果不存在满足该分数的情况,则输出10个0:0000000000 

样例输入: 100 

样例输出:

0010110011|0111010000|1011010000 

答案提示:     

3、Word Maze(单词迷宫) 描述: 

????Word?Maze?是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉。如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f。 

但现在你的任务可没有这么简单,你现在处于一个迷宫Maze(n×m的矩阵)当中,里面到处都是以字母标注的食物,但你只能吃掉能连成给定单词W的食物。 

如下图,指定W为“SOLO”,则在地图中红色标注了单词“SOLO”。

 



 

注意区分英文字母大小写,你只能上下左右行走。 

运行时间限制: 无限制 

内存限制: 无限制 

 输入:  输入第一行包含两个整数n、m(0<n,?m<21)分别表示n行m列的矩阵,第二行是长度不超过100的单词W,从第3行到底n+3行是只包含大小写英文字母的长度为m的字符串。   输出:  如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。 注意:每个字母只能用一次。  

 样例输入: 5 5

SOLO

CPUCY

 EKLQH

CRSOL

EKLQO

PGRBC  

样例输出: YES 

注意区分英文字母大小写,你只能上下左右行走。
运行时间限制:无限制
内存限制:无限制
输入:输入第一行包含两个整数n、m(0<n, m<21)分别表示n行m列的矩阵,第二行是长度不超过100的单词W,从第3行到底n+3行是只包含大小写英文字母的长度为m的字符串。
输出:如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。注意:每个字母只能用一次。
样例输入:
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC

样例输出:
YES

注意区分英文字母大小写,你只能上下左右行走。
运行时间限制:无限制
内存限制:无限制
输入:输入第一行包含两个整数n、m(0<n, m<21)分别表示n行m列的矩阵,第二行是长度不超过100的单词W,从第3行到底n+3行是只包含大小写英文字母的长度为m的字符串。
输出:如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。注意:每个字母只能用一次。
样例输入:
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC

样例输出:
YES

答案提示:    

import java.util.*;  
public class Main{  
      
    private static int n, m;  
    private static boolean[][] flagArr;  
    private static char[][] array;  
    private static boolean isFound;  
      
    public static void main(String args[]){  
        Scanner cin = new Scanner(System.in);  
        String word;  
        while (cin.hasNext()){  
            n = cin.nextInt();  
            m = cin.nextInt();  
            array = new char
[m];  
            word = cin.next();  
            isFound = false;  
            for(int i=0; i<n; i++) {  
                array[i] = cin.next().toCharArray();  
            }  
            flagArr = new boolean
[m];  
            for(int i=0; i<n; i++) {  
                for(int j=0; j<m; j++){  
                    flagArr[i][j] = false;  
                }  
            }  
              
            findWord(word);  
              
            if(isFound) {  
                System.out.println("YES");  
            } else {  
                System.out.println("NO");  
            }  
        }  
    }  
  
    private static void findWord(String word) {  
        for(int i=0; i<n; i++)   
            for(int j=0; j<m; j++) {  
                if(array[i][j] == word.charAt(0)) {  
                    flagArr[i][j] = true;  
                    findNext(word, 1, i, j);  
                    if(isFound)  
                        return ;  
                    else  
                        flagArr[i][j] = false;  
                }  
            }  
    }  
  
    private static void findNext(String word, int index, int x, int y) {  
        if(index == word.length()) {   
            isFound = true;  
            return ;  
        } else if(index < word.length()){  
            int nextIndex = index + 1;  
            //up  
            if ((x-1)>=0 && (!flagArr[x-1][y]) && array[x-1][y]==word.charAt(index)) {  
                flagArr[x-1][y] = true;  
                findNext(word, nextIndex, x-1, y);  
            }  
            //right  
            if((y+1)<m && (!flagArr[x][y+1]) && array[x][y+1]==word.charAt(index)) {  
                flagArr[x][y+1] = true;  
                findNext(word, nextIndex, x, y+1);  
            }  
            //dowm  
            if ((x+1)<n && (!flagArr[x+1][y]) && array[x+1][y]==word.charAt(index)) {  
                flagArr[x+1][y] = true;  
                findNext(word, nextIndex, x+1, y);  
            }  
            //left  
            if((y-1)>0 && (!flagArr[x][y-1]) && array[x][y-1]==word.charAt(index)) {  
                flagArr[x][y-1] = true;  
                findNext(word, nextIndex, x, y-1);  
            }  
            flagArr[x][y] = false;  
        }  
    }  
      
}  
import java.util.*;
public class Main{

private static int n, m;
private static boolean[][] flagArr;
private static char[][] array;
private static boolean isFound;

public static void main(String args[]){
Scanner cin = new Scanner(System.in);
String word;
while (cin.hasNext()){
n = cin.nextInt();
m = cin.nextInt();
array = new char
[m];
word = cin.next();
isFound = false;
for(int i=0; i<n; i++) {
array[i] = cin.next().toCharArray();
}
flagArr = new boolean
[m];
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++){
flagArr[i][j] = false;
}
}

findWord(word);

if(isFound) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}

private static void findWord(String word) {
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
if(array[i][j] == word.charAt(0)) {
flagArr[i][j] = true;
findNext(word, 1, i, j);
if(isFound)
return ;
else
flagArr[i][j] = false;
}
}
}

private static void findNext(String word, int index, int x, int y) {
if(index == word.length()) {
isFound = true;
return ;
} else if(index < word.length()){
int nextIndex = index + 1;
//up
if ((x-1)>=0 && (!flagArr[x-1][y]) && array[x-1][y]==word.charAt(index)) {
flagArr[x-1][y] = true;
findNext(word, nextIndex, x-1, y);
}
//right
if((y+1)<m && (!flagArr[x][y+1]) && array[x][y+1]==word.charAt(index)) {
flagArr[x][y+1] = true;
findNext(word, nextIndex, x, y+1);
}
//dowm
if ((x+1)<n && (!flagArr[x+1][y]) && array[x+1][y]==word.charAt(index)) {
flagArr[x+1][y] = true;
findNext(word, nextIndex, x+1, y);
}
//left
if((y-1)>0 && (!flagArr[x][y-1]) && array[x][y-1]==word.charAt(index)) {
flagArr[x][y-1] = true;
findNext(word, nextIndex, x, y-1);
}
flagArr[x][y] = false;
}
}

}


 

一、字符串截断输出(60分)

首先输入两个整数m,n,分别代表行数和长度,要求输出,将字符串截短成n长,不够补0,多了换行继续输出 如输入: 2,8

1234567812345678123 asd  输出

12345678 12345678 12300000 asd00000  

二、字符串过滤后排序(60分)

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉,然后按字母表顺序输出。 比如字符串“abfcacde”输出结果为“abcdef”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 c