2017华为优招笔试题

 

哎,没有接到笔试通知,不知道为啥就错过了。

之后见到题目,前两道编程题。其实都见过类似的题目,有点思路,但是直接快速完整实现出来,水平还是达不到。

这样的题目,也不算难,三道编程题至少AC两道才算可以。但是自己还是写代码写的少,需要多练习,增加熟练度。

第一道题,统计一个字符串中,出现的字母字符串,数字字符串和其他字符组成的字符串的个数。

思想非常简单直观,但对于边界条件以及何时将统计的数量进行增加要仔细考虑。

代码如下:

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str;
	getline(cin,str);

	int a[3] = { 0, 0, 0 };
	for (int i = 0; i < str.length()-1;){
		while (((str[i] >‘A‘ && str[i] <= ‘Z‘) || (str[i] >= ‘a‘ && str[i] <= ‘z‘)) && i<str.length() - 1){
			while (((str[i] >‘A‘ && str[i] <= ‘Z‘) || (str[i] >= ‘a‘ && str[i] <= ‘z‘)) && i<str.length() - 1){
				++i;
			}
			a[0]++;
			break;
		}
		while ((str[i] >=‘0‘&& str[i] <= ‘9‘ ) && i<str.length() - 1){
			while ((str[i] >= ‘0‘ && str[i] <= ‘9‘) && i<str.length() - 1){
				++i;
			}
			a[1]++;
			break;
		}
		while ((str[i] >= 0 && str[i] <= 47) || (str[i] >= 58 && str[i] <= 64) || (str[i] >= 91 && str[i] <= 96) || (str[i] >= 123) && i<str.length() - 1){
			while ((str[i] >= 0 && str[i] <= 47) || (str[i] >= 58 && str[i] <= 64) || (str[i] >= 91 && str[i] <= 96) || (str[i] >= 123) && i<str.length() - 1){
				++i;
			}
			a[2]++;
			break;
		}

	}

	for (int m = 0; m < 3; m++){
		cout << a[m];
		if (m < 2){
			cout << ",";
		}
	}

	system("pause");
	return 0;
}

第二题是将字符串按照单词逐个反转的题目,也是常见题目。一般思想都是做两次翻转。整个字符串翻转,然后将单词逐个翻转。

例如:输入 i am student      输出:student am i

代码如下:

/*

对字符串进行逐词翻转;

*/

#include <iostream>
using namespace std;
//编程实现字符串中各单词的翻转
//方法1
void Revese(char *str){

	char *start = str, *end = str, *ptr = str; //开头,结尾,中间指针
	while (*ptr++ != ‘\0‘)
	{
		if (*ptr == ‘ ‘ || *ptr == ‘\0‘) //找到一个单词
		{
			end = ptr - 1; //end指向单词末尾
			while (start<end)
				swap(*start++, *end--); //把单词的字母逆置
			start = end = ptr + 1; //指向下一个单词开头
		}
	}

	start = str, end = ptr - 2;//start指向字符串开头,end指向字符串末尾
	while (start<end)
	{
		swap(*start++, *end--);
	}
}

int main()
{
	char Str[30] = "i am from henan";
	Revese(Str);
	cout << Str << endl;
	getchar();
	return 0;
}

方法二:

#include "stdafx.h"
#include <iostream>
using namespace std;
//编程实现字符串中各单词的翻转
//方法2
void Revese(char *str){
	char *start=str,*end=str,*ptr=str;
	while (*ptr++!=‘\0‘);
	end=ptr-2; //找到字符串末尾
	while (start<end)
	{
		swap(*start++,*end--);//将整个字符串逆置
	}
	start=str;//指向字符串开头
	end=ptr-2;//指向字符串末尾
	ptr=start;//指向字符串开头
	while (*ptr++!=‘\0‘)
	{
		if (*ptr==‘ ‘||*ptr==‘\0‘) //找到一个单词
		{
			end=ptr-1;//指向单词末尾
			while (start<end)
			{
				swap(*start++,*end--);
			}
			start=end=ptr+1;//指向下一个单词开头
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	char Str[30]="i am from henan";
	Revese(Str);
	cout<<Str<<endl;
	getchar();
	return 0;
}
时间: 2024-12-09 03:36:53

2017华为优招笔试题的相关文章

2017年华为优招机试题_平安果_编程题

题目描述 简要描述: 给定一个M行N列的矩阵(M*N个格子),每个格子中放着一定数量的平安果. 你从左上角的格子开始,只能向下或向右走,目的地是右下角的格子. 每走过一个格子,就把格子上的平安果都收集起来.求你最多能收集到多少平安果. 注意:当经过一个格子时,需要要一次性把格子里的平安果都拿走. 限制条件:1 < N, M <= 50:每个格子里的平安果数量是0到1000(包含0和1000). 输入描述: 输入包括两行: 第一行为矩阵的行数M和列数N 第二行为一个M*N的矩阵,矩阵的数字代表平

华为补招笔试题20171130

注:实现时无需考虑不合法的情况. 解答过程:感觉没有问题,可后来通过率才37.5%,puzzle. #include <iostream> using namespace std; #include <string> #include <vector> #include <algorithm> //转化为大写 string strToUpper(string &str) { for (int i = 0; i < str.size(); i++

网易2017秋招笔试题3:最长公共子括号序列长度

[问题来源]网传的2017网易秋招笔试题 [问题描述] [算法思路] 下面的解题思路摘自  http://www.cnblogs.com/Atanisi/p/7500186.html 刚看到题我就想到暴力解,深搜出所有合法的括号序列,再依次比较公共子序列的长度,返回最长的.但是深搜一般和路径有关,这道题仅仅需要最大公共子序列的长度.而我们发现最大公共子序列的长度就是 s.size() - 1(当且仅当修改距离为 1 时 LCS 最大), 那么我们就想到,可以变换 s 中一个括号的位置,枚举所有的

华为C语言笔试题集合

①华为笔试题搜集 1.static有什么用途?(请至少说明两种)    1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.    2) 在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用函数訪问,但不能被模块外其他函数訪问.它是一个本地的全局变量.    3) 在模块内,一个被声明为静态的函数仅仅可被这一模块内的其他函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么差别?    1) 引用必须被初始化,指针不必.    2)

2014华为实习上级笔试题——三天打鱼两天晒网

#include<iostream> using namespace std; int func(int year)//判断闰年的个数 { int count=0; for(int i=1990;i<year;i++) if(year%4==0&&year%100!=0||year%400==0) count++; return count; } int main() { int year,month,day; int count,sum,num; //!!!!!!!!!

2014华为实习上级笔试题-- 统计字符串中出现的单词

#include<iostream> //#include<string> using namespace std; struct node { char word[10]; int num; }; node obj[100]; void my_word(char input[], char output[]) { int sum=0,flag=0; int i=0,j=0,k=0; while(input[i]!='\0')///////////读入单词 { if((input[

算法面试题-今日头条2017客户端工程师实习生笔试题4:或与加

今日头条2017客户端工程师实习生笔试题 题目: 这个题做到最后,时间不是很够,题目内容比较简单,求出第k个正整数符合x+y=x|y,然而这个k的取值范围非常大(k<=2000000000),所以可以不用考虑穷举法,当然,时间不够的话写个穷举试试运气也可以. 穷举法: 1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 2016/9/6. 5 */ 6 7 public class Main { 8 public

今日头条2017后端工程师实习生笔试题 - 题解

今日头条2017后端工程师实习生笔试题 最大映射 题意 给n(不超过50)个字符串,每个字符串(长度不超过12)由A-J的大写字符组成.要求将每个字符映射为0-9,使得每个字符串可以看作一个整数(不能有前导零),求这些字符串映射后得到数字的最大和值.(数据保证至少有一个字符不是任何字符串的首字母) 思路 根据字符所在的位置,累积统计每个字符的权值,从右到左权值分别为1, 10, 100, 1000..... 然后排序,从权值最小的到权值最大的依次映射为0-9,求和即为答案. 注意 由于每个字符串

美团2017秋招笔试题 拼凑钱币

给你六种面额 1.5.10.20.50.100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数. 输入描述: 输入包括一个整数n(1 ≤ n ≤ 10000) 输出描述: 输出一个整数,表示不同的组合方案数 设f[i][j]为使用a[0]-a[i]的面额凑到j元的不同组合个数 #include <iostream> #include <cstring> using namespace std; int a[6] = {1,5