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校园招聘实习生笔试编程题相关推荐

  1. 奇虎360校园招聘2015笔试题目

  2. 2016奇虎360校园招聘编程题目

    1.给个一个正整数n<1000000,以素数相乘的形式输出n的值,如20=2*2*5;10=2*5;2=2,而输出的素数都是按计算器上面的数字来显示的,即每个数字都是以如下形式来输出的 首先要解 ...

  3. 【顺丰科技】2019校园招聘在线笔试编程题

    微信公众号 1. 行程安排 题目描述: 我是一个大帅哥,因此有很多粉丝想和我合影,想请我吃饭,也有很多签售演唱会等着我,总之我很忙.可是,我的秘书非常的不靠谱,他总是把一些日程安排在重复的时间上,比如 ...

  4. 奇虎360_2017校园招聘笔试编程题第一题

    今晚做了360的校招笔试题,编程题难度适中,在这里跟大家分享一下编程题的第一题. 1. 题目 2. 输入输出及样例 3. 我的思路 这题应该看题目理解一下就有思路,最简单粗暴的就是创建一个二维数组in ...

  5. 奇虎360_2017校园招聘笔试编程题第二题

    今晚做了360的校招笔试题,编程题难度适中,在这里跟大家分享一下编程题的第二题.第二道题也不难想到思路,但是如果写法不当,可能无法满足题目的时间限制. 1. 题目 2. 输入输出及样例 3. 我的思路 ...

  6. 深信服2018校园招聘C++工程师编程题 - 题解

    深信服2017的校园招聘的题目和这次的几乎一样,不知道贵公司是什么样的想法.做过2017的题目的同学应该会比较占优势.题目不难,比较考验编程的技巧与准确度. 第一题:堆排序 题目: 函数heap_so ...

  7. 奇安信2021年校招笔试编程题

    < 2020年9月12日奇安信笔试编程第一题 > <java实现获取数组中的连续子数组> 1. 题目信息 2. 参数要求 3. 解题思路 该题获取糖果可以分解为两个部分: (1 ...

  8. 深信服 2022届校园招聘 C++笔试编程题目

    试卷情况 试卷包括不定项选择题11道,填空题11道,编程题2道,限时120分钟. 第一道编程题 题目:一个厨师出售1-6六种不同的食物,每种食物都需要使用各自的特殊厨具,厨师的灶台最多只能同时摆放3种 ...

  9. 京东2017实习生招聘在线笔试编程题

    很惭愧不是自己做出来的,不过知道思路了就很简单 #include <iostream> using namespace std;void initarr(double **&arr ...

最新文章

  1. apache httpd 1
  2. ssm mysql动态分页_SSM项目手动分页详解
  3. (转)java.lang.RuntimeException: Missing type parameter
  4. AQS源码阅读笔记(一)
  5. IdentityServer4 实现自定义 GrantType 授权模式
  6. jmeter 压测duobbo接口,施压客户端自己把自己压死了
  7. 你解决的问题比你编写的代码更重要! 1
  8. 使用Go语言创建WebSocket服务
  9. gradle5.6.3软件安装
  10. Android Studio属性动画,Android开发-RecyclerView-AndroidStudio(六)属性动画(3)AddDuration
  11. ArcGIS Pro 性能诊断
  12. sql server 2005安装需求
  13. Nginx是如何处理一个HTTP请求的
  14. 威feng网站的aes算法破解
  15. python3 安装 pillow报错
  16. 大数据薪水大概多少_大数据就业岗位有哪些?薪资多少?
  17. 运营商-银联-手机厂商,三巨头如何依次主导NFC
  18. 总结两种常规地磁匹配算法MAGCOM算法/ICCP算法的特性
  19. 单曲循环 翻译_Loop, repeat and replay “单曲循环” 用哪个词?
  20. 焦虑,不知所措,努力应对,坦然,双非本硕求职算法的故事

热门文章

  1. 思科:利用三层交换机实现vlan间路由
  2. 为什么要学Markdown?有什么用?
  3. 【Flink】学习笔记-20200302更新
  4. Cesium最新基础教程系列2—Viewer离线加载地图数据(高程数据,地图瓦片(卫星影像、电子地图)),Viewer属性详解,及离线自定义图层
  5. pstack无法使用的问题
  6. Linux strace、pstack 命令 使用详解
  7. 快排平均复杂度O(nlogn)证明
  8. php小数点后保留一位或两位小数
  9. @5-1 CCF 2019-12-1 报数
  10. Photoshop从入门到精通所有视频教程(43G)以及素材资料免费拿