2012年奇虎360校园招聘实习生笔试编程题
2012年奇虎360校园招聘实习生笔试编程题
1. 自己实现库函数 int atoi(const char* str);
注意两点:(1). 字符串中,符号位的处理。
(2).字符串中,出现非数字字符。
(3). 进制考虑(如八进制只以0开头,十六进制以0x或者0X开头)
实现原理: 霍纳规则(Hornor rule):
下面给出具体实现代码:
#include <stdio.h>
#include <stdlib.h>int atoi(const char* str);int main(int argc, char *argv[], char *env[]) {char * str = "+123dafd435";printf("%d\n", atoi(str));return 0;
}int atoi(const char *str) {int n;int sum;int sign;const char *p;p = str;sum = 0;sign = 0;if(NULL==p) exit(1);if(*p == '-' || *p=='+') {if(*p=='-') sign = 1;/*switch(*p) {case '-':sign=1;break;case '+':sign=0;break;}*/p++;}while(*p!='\0') {if(*p<'0' || *p>'9') {//abort();if(p==str || p==str+1) {//abort();exit(1);}else {return sign ? -sum : sum;}}n = *p -'0';sum = sum*10 + n;p++;}return sign ? -sum : sum;}
运行结果:
version 2: 避免了对空串的操作。
#include <stdio.h>
#include <stdlib.h>int atoi(const char* str);int main(int argc, char *argv[], char *env[]) {char * str = "-123dafd435";printf("%d\n", atoi(str));return 0;
}int atoi(const char *str) {int n;int sum;int sign;const char *p;p = str;sum = 0;sign = 0; // 符号号位为‘+’ 或者无符号位//避免字符串指针无效以及字符串为空if(NULL==p || *p=='\0') exit(1);/* 符号位的处理 **/if(*p == '-' || *p=='+') {if(*p=='-') sign = 1; //符号位为‘-’p++; // 跳过符号位}while(*p!='\0') {//处理字符串中出现的,非数字字符if(*p<'0' || *p>'9') {if(p==str || p==str+1) { //无效的非数字串exit(1);}else {break; // 数字串中, 前半部分为有效的数字串,遇见非数字字符}}n = *p -'0';sum = sum*10 + n; //霍纳规则p++;}return sign ? -sum : sum;}
version 3: 增加了跳过数字串前的空格;
#include <stdio.h>
#include <stdlib.h>int atoi(const char* str);int main(int argc, char *argv[], char *env[]) {char * str = " \t \n -123dafd435";printf("%d\n", atoi(str));return 0;
}int atoi(const char *str) {int n;int sum;int sign;const char *p;sum = 0;sign = 0; // 符号号位为‘+’ 或者无符号位//避免字符串指针无效以及字符串为空if(NULL==str || *str=='\0') exit(1);//跳过空白符while(*str==' ' || *str=='\t' || *str=='\n') str++;p = str;/* 符号位的处理 **/if(*p == '-' || *p=='+') {if(*p=='-') sign = 1; //符号位为‘-’p++; // 跳过符号位}while(*p!='\0') {//处理字符串中出现的,非数字字符if(*p<'0' || *p>'9') {if(p==str || p==str+1) { //无效的非数字串exit(1);}else {break; // 数字串中, 前半部分为有效的数字串,遇见非数字字符}}n = *p -'0';sum = sum*10 + n; //霍纳规则p++;}return sign ? -sum : sum;}
version 4: 对八进制和十六进制的支持数字串的支持
#include <stdio.h>
#include <stdlib.h>int atoi(const char* str);int main(int argc, char *argv[], char *env[]) {/*char * str = " -123dafd435";char * octalStr = "0678";char * hexStr1 = "0xadfb";char * hexStr2 = "-0Xabad";*/char * numStr[] = { " 123dafd435", // decimal number string without sign" +123dafd435", // decimal number string with plus sign" -123dafd435", // decimal number string with minus sign"0678", // octal number string"+0678", // octal number string with plus sign"-0678", // octal number string with minus sign"0xadfb", // hexadecimal number string"sdfds+0xadgh", // hexadecimal number string with plus sign"-0xahgfh" // hexadecimal number string with minus sign};int i;int len = sizeof(numStr)/sizeof(numStr[0]);for(i=0; i<len; i++) {printf("%s: %d\n", numStr[i], atoi(numStr[i]) );}//printf("%d\n", atoi(str));return 0;
}int atoi(const char *str) {int n;int sum;int sign;int base;const char *p;char c;sum = 0;sign = 0; // 符号号位为‘+’ 或者无符号位base = 10;//避免字符串指针无效以及字符串为空if(NULL==str || *str=='\0') exit(1);//跳过空白符while(*str==' ' || *str=='\t') str++;p = str;/* 符号位的处理 **/if(*p=='-' || *p=='+') {if(*p=='-') sign = 1; //符号位为‘-’p++; // 跳过符号位}//确定字符串的进制if(*p=='0') {if(*(p+1)=='x' || *(p+1)=='X') {base = 16;p++;}else {base = 8;}p++;}while(*p!='\0') {c = *p;if(c>='0'&&c<='9') {n = c - '0';}else if(c>='A'&&c<='F'){ //十六进制数字n = c - 'A' + 10;}else if(c>='a'&& c<='f'){ //十六进制数字n = c - 'a' + 10;}else {break; //非法字符}if(n>=base) break; //进制错误sum = sum*base + n; //霍纳规则p++;}return sign ? -sum : sum;}
version 5:对八进制和十六进制的转化用移位代替乘法。
#include <stdio.h>
#include <stdlib.h>int atoi(const char* str);int main(int argc, char *argv[], char *env[]) {/*char * str = " -123dafd435";char * octalStr = "0678";char * hexStr1 = "0xadfb";char * hexStr2 = "-0Xabad";*/char * numStr[] = { " 123dafd435", // decimal number string without sign" +123dafd435", // decimal number string with plus sign" -123dafd435", // decimal number string with minus sign"06778", // octal number string"+06778", // octal number string with plus sign"-06778", // octal number string with minus sign"0xadfb", // hexadecimal number string"sdfds+0xadgh", // hexadecimal number string with plus sign"-0xahgfhgdb" // hexadecimal number string with minus sign};int i;int len = sizeof(numStr)/sizeof(numStr[0]);for(i=0; i<len; i++) {printf("%s: %d\n", numStr[i], atoi(numStr[i]) );}//printf("%d\n", atoi(str));return 0;
}int atoi(const char *str) {int n;int sum;int sign;int base;int d;const char *p;char c;sum = 0;sign = 0; // 符号号位为‘+’ 或者无符号位base = 10;//避免字符串指针无效以及字符串为空if(NULL==str || *str=='\0') exit(1);//跳过空白符while(*str==' ' || *str=='\t') str++;p = str;/* 符号位的处理 **/if(*p=='-' || *p=='+') {if(*p=='-') sign = 1; //符号位为‘-’p++; // 跳过符号位}//确定字符串的进制if(*p=='0') {if(*(p+1)=='x' || *(p+1)=='X') {base = 16;d = 4;p++;}else {base = 8;d=3;}p++;}while(*p!='\0') {c = *p;if(c>='0'&&c<='9') {n = c - '0';}else if(c>='A'&&c<='F'){ //十六进制数字n = c - 'A' + 10;}else if(c>='a'&& c<='f'){ //十六进制数字n = c - 'a' + 10;}else {break; //非法字符}if(n>=base) break; //进制错误if(base==10){sum = sum*base + n; //霍纳规则}else {sum <<= d;sum |= n;}p++;}return sign ? -sum : sum;}
2. 笔试的第二个答题: 是关于互斥锁和共享锁的两个英文句子的翻译。
大致的意思是: 在受保护的临界区上,如果已经加上了互斥锁,其他任何进程都不能再在其上加共享锁或者互斥锁。对没有写权限的文件,加互斥锁操作将失败。
总结: 奇虎360的笔试:前面客观题,要涂卡。客观题分两部分: 1.逻辑推理题。(像考公务员死的)2. 基础的计算机知识。
其他:
#include <iostream>
#include <cstring>using namespace std;const char* strNums[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", };int getNumValue(const char * strNum){for (int i = 0; i < 10; ++i) {if (strcmp(strNum, strNums[i]) == 0) {return i;}}return -1;
}int isSeperator(int c) {if(c == ' ' || c == '\t' || c == '\n') return 1;return 0;
}/*
int isOperator(int c) {if( c == '+' || c == '-' || c == '*' || c == '/' || c == '=') return 1;return 0;
}
*/int cal1(const char *str) {char buffer[6];int len = 0;int strLen = strlen(str);int sum = 0;int first = 0;while(sscanf(str + len, "%s", buffer) == 1) { if(buffer[0] != '+' && buffer[0] != '=') { first = first * 10 + getNumValue(buffer); }else {sum += first;first = 0;} if(buffer[0] == '=') break;len += strlen(buffer); ++len; }return sum;}int cal(const char *str) {char buffer[6];int len = 0;int strLen = strlen(str);const char *p = str;int sum = 0;int first = 0;while(isSeperator(*p)) ++p; //跳过空白符while(sscanf(p, "%s", buffer)==1 ) { if(buffer[0] != '+' && buffer[0] != '=') { first = first * 10 + getNumValue(buffer); }else {sum += first;first = 0;} if(buffer[0] == '=') break;len = strlen(buffer); ++len;p += len;while(isSeperator(*p)) ++p; //跳过空白符}return sum;
}int main()
{ char str[] = " one two three one + five six =";cout<< cal(str) << endl;return 0;}
2012年奇虎360校园招聘实习生笔试编程题相关推荐
- 奇虎360校园招聘2015笔试题目
- 2016奇虎360校园招聘编程题目
1.给个一个正整数n<1000000,以素数相乘的形式输出n的值,如20=2*2*5;10=2*5;2=2,而输出的素数都是按计算器上面的数字来显示的,即每个数字都是以如下形式来输出的 首先要解 ...
- 【顺丰科技】2019校园招聘在线笔试编程题
微信公众号 1. 行程安排 题目描述: 我是一个大帅哥,因此有很多粉丝想和我合影,想请我吃饭,也有很多签售演唱会等着我,总之我很忙.可是,我的秘书非常的不靠谱,他总是把一些日程安排在重复的时间上,比如 ...
- 奇虎360_2017校园招聘笔试编程题第一题
今晚做了360的校招笔试题,编程题难度适中,在这里跟大家分享一下编程题的第一题. 1. 题目 2. 输入输出及样例 3. 我的思路 这题应该看题目理解一下就有思路,最简单粗暴的就是创建一个二维数组in ...
- 奇虎360_2017校园招聘笔试编程题第二题
今晚做了360的校招笔试题,编程题难度适中,在这里跟大家分享一下编程题的第二题.第二道题也不难想到思路,但是如果写法不当,可能无法满足题目的时间限制. 1. 题目 2. 输入输出及样例 3. 我的思路 ...
- 深信服2018校园招聘C++工程师编程题 - 题解
深信服2017的校园招聘的题目和这次的几乎一样,不知道贵公司是什么样的想法.做过2017的题目的同学应该会比较占优势.题目不难,比较考验编程的技巧与准确度. 第一题:堆排序 题目: 函数heap_so ...
- 奇安信2021年校招笔试编程题
< 2020年9月12日奇安信笔试编程第一题 > <java实现获取数组中的连续子数组> 1. 题目信息 2. 参数要求 3. 解题思路 该题获取糖果可以分解为两个部分: (1 ...
- 深信服 2022届校园招聘 C++笔试编程题目
试卷情况 试卷包括不定项选择题11道,填空题11道,编程题2道,限时120分钟. 第一道编程题 题目:一个厨师出售1-6六种不同的食物,每种食物都需要使用各自的特殊厨具,厨师的灶台最多只能同时摆放3种 ...
- 京东2017实习生招聘在线笔试编程题
很惭愧不是自己做出来的,不过知道思路了就很简单 #include <iostream> using namespace std;void initarr(double **&arr ...
最新文章
- apache httpd 1
- ssm mysql动态分页_SSM项目手动分页详解
- (转)java.lang.RuntimeException: Missing type parameter
- AQS源码阅读笔记(一)
- IdentityServer4 实现自定义 GrantType 授权模式
- jmeter 压测duobbo接口,施压客户端自己把自己压死了
- 你解决的问题比你编写的代码更重要! 1
- 使用Go语言创建WebSocket服务
- gradle5.6.3软件安装
- Android Studio属性动画,Android开发-RecyclerView-AndroidStudio(六)属性动画(3)AddDuration
- ArcGIS Pro 性能诊断
- sql server 2005安装需求
- Nginx是如何处理一个HTTP请求的
- 威feng网站的aes算法破解
- python3 安装 pillow报错
- 大数据薪水大概多少_大数据就业岗位有哪些?薪资多少?
- 运营商-银联-手机厂商,三巨头如何依次主导NFC
- 总结两种常规地磁匹配算法MAGCOM算法/ICCP算法的特性
- 单曲循环 翻译_Loop, repeat and replay “单曲循环” 用哪个词?
- 焦虑,不知所措,努力应对,坦然,双非本硕求职算法的故事