发布于 2014-10-17 07:39:56 | 252 次阅读 | 评论: 0 | 来源: 网友投递
华为
华为技术有限公司是一家生产销售通信设备的民营通信科技公司,总部位于中国广东省深圳市龙岗区坂田华为基地。华为的产品主要涉及通信网络中的交换网络、传输网络、无线及有线固定接入网络和数据通信网络及无线终端产品,为世界各地通信运营商及专业网络拥有者提供硬件设备、软件、服务和解决方案。华为于1987年在中国深圳正式注册成立。
上午第一题:要求递归实现计算整数的各个位置之和
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int calc(int x)
{
if(x < 10) return x;
return (x%10) + calc(x/10);
}
int main()
{
int a;
scanf("%d" , &a);
int ans = calc(a);
printf("%d\n" , ans);
}
上午第二题:整数排序。要求输入一串整数,中间用逗号隔开,然后排完序用逗号隔着输出,要求
:只输出连续数中最大和最小的两个数,例如
输入为
1,4,7,2,5,8,9,11
输出为
11,9,7,5,4,2,1
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[1010] , n;
char s[10100];
bool cmp(int a,int b)
{
return a > b;
}
int main() {
while(scanf("%s" , s) != EOF) {
int tmp = 0 , len = strlen(s);
n = 0;
for(int i=0;i<len;i++)
{
if(s[i] >= '0' && s[i] <= '9')
tmp = tmp * 10 + (s[i] - '0');
else
{
a[n++] = tmp;
tmp = 0;
}
}
a[n++] = tmp;
sort(a , a+n , cmp);
printf("%d" , a[0]);
for(int i=1;i<n;i++) {
if(i!= n-1 && a[i-1]-a[i]==1 && a[i]-a[i+1]==1) continue;
printf(",%d" , a[i]);
}
puts("");
}
return 0;
}
下午第二题:N个人报数
有N个人围成一圈,从1开始顺序排号,从第一个人开始报数(从一到三报数),凡到三的人退出圈子,问最后留下来的是原来第几号的那位?
解:循环链表实现。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int next[110] , n;
void init() {
for(int i=1;i<n;i++) next[i] = i + 1;
next[n] = 1;
}
int get(int p) {
int q;
for(int i=0;i<2;i++) {
q = p;
p = next[p];
}
next[q] = next[p];
return next[p];
}
int main() {
while(scanf("%d" , &n) != EOF) {
init();
int p = 1;
for(int i=0;i<n;i++) p = get(p);
printf("%d\n" , p);
}
return 0;
}
java代码:
import java.util.*;
public class Main
{
public static void getLastPeople(int number)
{
int[] people = new int[number];
for (int i = 0; i < number; i++)
people[i] = 1;
int index = 0, count = number;
while (count > 1)
{
for (int i = 0; i < number; i++)
{
if (people[i] > 0)
{
index++;
if (index == 3)
{
people[i]--;
index = 0;
count--;
}
}
}
}
for (int i = 0; i < number; i++)
{
if (people[i] > 0)
{
System.out.print((i + 1) % 3);
}
}
}
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
while (cin.hasNext())
{
int number = cin.nextInt();
getLastPeople(number);
}
}
}
下午第一题:输入一个正整数,并编码为字符串进行输出。
描述:
1.输入一个正生疏,并编码为字符串进行输出。
编码规则为:数字0~9分别编码为字符a-j。
2.输入肯定是正整数,不用做错误校验。
例:
输入
123
输出
bcd
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char s[1010];
int main() {
while(scanf("%s" , s) != EOF) {
int len = strlen(s);
for(int i=0;i<len;i++) putchar(s[i]-'0'+'a');
puts("");
}
return 0;
}
下午第三题:字符串比较排序(2)
描述:
1.字符串由大小写字母、数字机空格组成,一个或多个空格将多个字符串隔开
2.解析出个字符串
3.输出结果时,将得出的各子串从大到小排序,如果长度一样,按照小写字母>大写字母>数字,进行排序
比如w23r at 1rt Af w13r , 排序后为13r w23r 1rt at Af
用C++的string类很好实现,主要是比较函数cmp稍微有点烦
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
char ch[101010];
string s[1010];
int n , len;
bool isl(char c) {
return c >= 'a' && c <= 'z';
}
bool isb(char c) {
return c >= 'A' && c <= 'Z';
}
bool isd(char c) {
return c >= '0' && c <= '9';
}
bool cmp(string a,string b) {
if(a.length() != b.length()) return a.length() > b.length();
int len = a.length();
for(int i=0;i<len;i++) {
if( (isl(a[i]) && isl(b[i]) || isb(a[i]) && isb(b[i]) || isd(a[i]) && isd(b[i])) && a[i] != b[i]) return a[i] > b[i];
if(isl(a[i]) || isd(b[i])) return 1;
if(isl(b[i]) || isd(a[i])) return 0;
}
return 1;
}
int main() {
gets(ch);
len = strlen(ch);
n = 0;
s[0] = "";
for(int i=0;i<len;i++) {
if(ch[i] == ' ') {
if(s[n].length()) n++ , s[n] = "";
}
else s[n] += ch[i];
}
if(s[n].length()) n ++;
/*
printf("length is %d\n" , len);
printf("n is %d\n" , n);
for(int i=0;i<n;i++) {
printf("%d : %d\n" , i , s[i].length());
}
cout << s[0];
for(int i=1;i<n;i++) cout << " " <<s[i];
cout << endl;
*/
sort(s , s+n , cmp);
cout << s[0];
for(int i=1;i<n;i++) cout << " " <<s[i];
cout << endl;
return 0;
}