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

本文介绍了2014年华为校招提前批次的编程题目,包括简易字符串压缩算法、竞赛积分猜想和单词迷宫问题。题目涉及字符串处理、逻辑推理和深度搜索算法,要求在限定时间内完成并满足特定输出格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是华为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

答案提示:    

  1. import java.util.*;  
  2. public class Main{  
  3.       
  4.     private static int n, m;  
  5.     private static boolean[][] flagArr;  
  6.     private static char[][] array;  
  7.     private static boolean isFound;  
  8.       
  9.     public static void main(String args[]){  
  10.         Scanner cin = new Scanner(System.in);  
  11.         String word;  
  12.         while (cin.hasNext()){  
  13.             n = cin.nextInt();  
  14.             m = cin.nextInt();  
  15.             array = new char[n][m];  
  16.             word = cin.next();  
  17.             isFound = false;  
  18.             for(int i=0; i<n; i++) {  
  19.                 array[i] = cin.next().toCharArray();  
  20.             }  
  21.             flagArr = new boolean[n][m];  
  22.             for(int i=0; i<n; i++) {  
  23.                 for(int j=0; j<m; j++){  
  24.                     flagArr[i][j] = false;  
  25.                 }  
  26.             }  
  27.               
  28.             findWord(word);  
  29.               
  30.             if(isFound) {  
  31.                 System.out.println("YES");  
  32.             } else {  
  33.                 System.out.println("NO");  
  34.             }  
  35.         }  
  36.     }  
  37.   
  38.     private static void findWord(String word) {  
  39.         for(int i=0; i<n; i++)   
  40.             for(int j=0; j<m; j++) {  
  41.                 if(array[i][j] == word.charAt(0)) {  
  42.                     flagArr[i][j] = true;  
  43.                     findNext(word, 1, i, j);  
  44.                     if(isFound)  
  45.                         return ;  
  46.                     else  
  47.                         flagArr[i][j] = false;  
  48.                 }  
  49.             }  
  50.     }  
  51.   
  52.     private static void findNext(String word, int index, int x, int y) {  
  53.         if(index == word.length()) {   
  54.             isFound = true;  
  55.             return ;  
  56.         } else if(index < word.length()){  
  57.             int nextIndex = index + 1;  
  58.             //up  
  59.             if ((x-1)>=0 && (!flagArr[x-1][y]) && array[x-1][y]==word.charAt(index)) {  
  60.                 flagArr[x-1][y] = true;  
  61.                 findNext(word, nextIndex, x-1, y);  
  62.             }  
  63.             //right  
  64.             if((y+1)<m && (!flagArr[x][y+1]) && array[x][y+1]==word.charAt(index)) {  
  65.                 flagArr[x][y+1] = true;  
  66.                 findNext(word, nextIndex, x, y+1);  
  67.             }  
  68.             //dowm  
  69.             if ((x+1)<n && (!flagArr[x+1][y]) && array[x+1][y]==word.charAt(index)) {  
  70.                 flagArr[x+1][y] = true;  
  71.                 findNext(word, nextIndex, x+1, y);  
  72.             }  
  73.             //left  
  74.             if((y-1)>0 && (!flagArr[x][y-1]) && array[x][y-1]==word.charAt(index)) {  
  75.                 flagArr[x][y-1] = true;  
  76.                 findNext(word, nextIndex, x, y-1);  
  77.             }  
  78.             flagArr[x][y] = false;  
  79.         }  
  80.     }  
  81.       
  82. }  
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[n][m];
			word = cin.next();
			isFound = false;
			for(int i=0; i<n; i++) {
				array[i] = cin.next().toCharArray();
			}
			flagArr = new boolean[n][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”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值