
GEEK编程练习
专注于C/C++编程练习,主要面向笔试面试,也包括一些趣味编程题目。
Sin_Geek
Lovelife
展开
-
GEEK编程练习— —4的次方数
题目快速判断输入的int型整数是否是4的N次幂。输入8161564输出NOYESNOYES分析可以直接使用判断3的次方数的对数换底的方法。也可以简接参考2的次方数的方法。这里给出参考2的次方数的方法。 1、n & (n - 1)可以用来判断一个数是否为2的次方数,即二进制下,只有最高位是1,由于2的次方数,不一定是4的次方数,比如8,还需要其他的限定条件,4的次方数的最高位的1都是计数原创 2016-08-27 23:15:08 · 1360 阅读 · 0 评论 -
GEEK编程练习— —3的次方数
题目快速判断输入的int型整数是否是3的N次幂。输入2724310输出YESYESNO分析利用对数的换底公式来做,换底公式为loga(b) = logc(b) / logc(a)。如果n是3的N次幂,则log3(n)一定是整数,利用换底公式可以写为log3(n) = log(n) / log(3)。问题变为判断log(n) / log(3)是否为整数。代码#include <iostream原创 2016-08-27 23:04:05 · 862 阅读 · 0 评论 -
GEEK编程练习— —2的次方数
题目快速判断输入的int型整数是否是2的N次幂。输入8564输出YESNOYES分析如果一个数是2的次方数,则二进数最高位为1,其它都为0。减1后,降位,其余为0的位变为1,把两数相与会得0。代码#include <iostream>using namespace std;int main(){ int x; cin >> x; if ((x > 0) && !(x原创 2016-08-27 22:21:21 · 837 阅读 · 0 评论 -
GEEK编程练习— —回文整数
题目判断输入的整数是否为回文整数输入32323-123输出YESNOInvalid Number原创 2016-08-26 13:33:48 · 786 阅读 · 0 评论 -
GEEK编程练习— —有效括号问题
题目给定一个字符串只包含(,),{,},[和],判断输入是否合法。括号必须按照正确顺序排列,如()和()[]是合法的,而(]和([)]不合法。输入()[]输出True输入([)]输出False分析利用栈stack的特性。代码#include <iostream>#include <string>#include <stack>using namespace std;int main(){原创 2016-06-19 20:46:02 · 1999 阅读 · 0 评论 -
GEEK编程练习— —反转整数
题目把输入的Integer类型数据进行翻转输出。原创 2016-06-12 08:51:47 · 1567 阅读 · 0 评论 -
GEEK编程练习— —回文构词法
题目给定一组字符串,返回根据回文构词法,同属于一组的字符串,所有输入都是小写。 回文构词法是指打乱字母顺序从而得到的新的单词,比如”dormitory“打乱字母顺序可以变成”dirty room”,”tea”可以变成”eat”。其中的字母种类和数目一致,只是字母排列顺序不同,若按字母顺序排序后相等,则属于同一组。输入teabageatdog输出tea eat分析可以使用unordered_m原创 2016-06-11 15:38:58 · 3093 阅读 · 0 评论 -
GEEK编程练习— —计数问题
题目假定以下是一组有规律的整数序列 1,11,21,1211,111221,…… 起始是”一个1“,那么接下来的数就是11 11可以被计为”两个1“,接下来的数就是21 然后21被计为”一个2一个1“,接下来的数就是1211 1211被计为”一个1一个2两个1“接下来的数就是111221 给定一个正整数n,输出序列第n个元素。输入4输出1211分析题目不难,但是挺有趣的,直接模拟这个过程原创 2016-06-11 15:18:32 · 2121 阅读 · 0 评论 -
GEEK编程练习— —罗马数字问题
题目输入的是一个整数或罗马数字,若为整数,输出对应的罗马数字;若为罗马数字,输出对应的整数。数值范围从1到3999。输入1100输出MC输入MC输出1100分析因为输入只有两种情况,判断一下首个字符为整数还是罗马数字,分两种情况进行转换。代码#include <iostream>#include <string>#include <cctype>#include <cstdlib>using原创 2016-06-07 15:57:49 · 2629 阅读 · 0 评论 -
GEEK编程练习— —有效数字
题目判断输入的字符串是否是数字输入0 0.1 abc1 a2e10输出YESYESNONOYES分析可以直接使用标准库函数strtod()代码#include <iostream>#include <string>#include <cstdlib>using namespace std;int main(){ string str; cin >> str;原创 2016-06-07 14:50:46 · 1769 阅读 · 0 评论 -
GEEK编程练习— —通配符匹配
题目实现’?’和’*’组成的通配符的匹配功能。 1) ‘?’匹配任意单个字母。 2) ‘*’匹配任意字母序列,包括空序列。 3) 输入的字符串要整体覆盖,不能部分覆盖。输入aa aaa aaaaa aaaa *aa a*ab ?*aab c*a*baab *b输出Not MatchMatchNot MatchMatchMatchMatchNot MatchMatch原创 2016-06-06 17:49:50 · 1940 阅读 · 0 评论 -
GEEK编程练习— —正则表达式匹配
题目实现’.’和’*’组成的正则表达式的匹配功能。 1) ‘.’匹配任意单个字母。 2) ‘*’匹配之前的n元素,n大于等于0。 3) 输入的字符串要整体覆盖,不能部分覆盖。输入aa aaa aaaaa aaaa a*aa .*ab .*aab c*a*b输出Not MatchMatchNot MatchMatchMatchMatchMatch分析使用递归的方法,主要考原创 2016-06-05 22:51:22 · 2587 阅读 · 0 评论 -
GEEK编程练习— —字符串匹配
题目给定字符串P和T,要求从T中找出与P相同的所有子串,并返回子串位置。输入str strsstrstrl输出1 5 8分析这其实是字符串模式匹配的问题。简单科普一下,模式匹配又可分为单模式匹配和多模式匹配,单模式匹配,即只有一个模式串;多模式匹配,即有k个模式串。常见的单模式匹配的算法有BF算法、KMP算法、BM算法等等。常见的多模式匹配算法有Trie树,AC自动机,WM算法, 后缀树等等。这里给原创 2016-06-05 14:53:22 · 2688 阅读 · 0 评论 -
GEEK编程练习— —回文字符串
题目其实关于回文的题目很多,这里再给出一个简单的题目。我们把空字符串也当作回文字符串。输入A man, a plan, a canal: Panama输出YES输入race a car输出NO分析这个题目没有难度,只是要稍微注意下大小写,还有要忽略掉空格和标点符号。代码#include <iostream>#include <string>#include <cctype>#include <原创 2016-06-03 17:15:37 · 2995 阅读 · 0 评论 -
GEEK编程练习— —寻找单个数
题目1给定一组整数,其中除了一个整数只出现一次外,其他每个整数都是成双出现。找到这个只出现一次的整数。要求: 1、线性时间复杂度 2、不开辟额外内存空间输入0 0 1 3 2 4 1 4 2输出3分析1异或操作可以实现偶数次清零的功能。代码1#include <iostream>#include <vector>using namespace std;int main(){ vect原创 2016-06-02 21:08:11 · 2770 阅读 · 0 评论 -
GEEK编程练习— —发糖果问题
题目假设N个小孩站成一排,每个小孩被分配了一个整数号码。要按照如下的要求给孩子们发糖。 1、每个小孩至少有一颗糖果 2、号码大的孩子比相邻的孩子分到的糖果要多 求最少要发出几颗糖果输入0 1 3 1 4输出9分析可以前后循环两遍,第一遍从前往后,把相邻的两个小孩中,前面号码比后面号码大的多发糖;第二遍从后往前,同样把相邻孩子中,后面号码比前面号码大的多发糖;最后加和得到结果。代码#includ原创 2016-06-01 22:41:38 · 5915 阅读 · 0 评论 -
GEEK编程练习— —格雷码
题目格雷码是一种二进制数值系统。在一组数的编码中,任意两个相邻的代码只有一位二进制数不同。给定一个非负整数n表示格雷码的位数,输出所有格雷码。 格雷码序列从0开始。格雷码不唯一。输入2输出00011110分析结果要输出二进制形式,可以使用bitset,这里设置最大位数为128位,可根据情况修改。格雷码公式为a ^ (a - 1)代码#include <iostream>#include <原创 2016-05-31 22:50:42 · 4693 阅读 · 1 评论 -
GEEK编程练习— —雨水存储问题
题目给定n个非负整数,分别代表围栏的高度,计算给定的这组数字代表的围栏能够容纳多少水,如图所示。输入0 1 0 2 1 0 1 3 2 1 2 1 输出6分析对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积是min(max_left, max_right) - height。所以可以先扫描一遍,找到最高的柱子,将数组分为两半,然后分别进行处理。代码#include <iostream>#原创 2016-05-26 15:24:36 · 3542 阅读 · 0 评论 -
GEEK编程练习— —四数求和
题目输入一个特定整数s和一组整数,要求从这组整数中找到四个数a,b,c,d,使a+b+c+d=s。按照升序排列,输出所有满足条件的a,b,c,d。具体格式如下:输入01 0 -1 0 -2 2输出-2 -1 1 2-2 0 0 2-1 0 0 1分析先排序,可以用hashmap缓存两个数的和,然后左右夹逼,时间复杂度O(n^2),空间复杂度O(n^2)代码#include <iostream>原创 2016-05-25 08:58:15 · 1217 阅读 · 0 评论 -
GEEK编程练习— —三数求和
题目输入一个特定整数s和一组整数,要求从这组整数中找到三个数a,b,c,使a+b+c=s。按照升序排列,输出所有满足条件的a,b,c。具体格式如下:输入 0 -1 0 1 2 -1 -4输出-1 -1 2-1 0 1分析先排序,然后左右夹逼,复杂度O(n^2) 此方法可以推广到k个数求和,先排序,做k-2次循环,在最内层循环左右夹逼,时间复杂度O(max(nlogn,n^(k-1)))代码#i原创 2016-05-24 21:03:22 · 5412 阅读 · 0 评论 -
GEEK编程练习— —两数求和
题目输入一个特定整数值和一组整数,要求从这组整数中找到两个数,使这两数之和等于特定值。按照从前往后的顺序,输出所有满足条件的两个数的位置。具体格式如下:输入91 2 4 5 7 9 11 输出2 53 4分析1)暴力解法,复杂度O(n^2),不考虑 2)hash。用哈希表存储每个数对应下标,复杂度O(n) 3)先排序,然后左右夹逼,排序O(nlogn),夹逼O(n),最终O(nlogn)。但原创 2016-05-23 22:08:42 · 5248 阅读 · 0 评论 -
GEEK编程练习— —最长连续序列
题目给定一个无序的整数数组,返回最长连续序列的长度。要求时间复杂度为O(n)。输入[100, 4, 200, 1, 3, 2, 0, -1]输出6分析因为要求时间负责度为O(n),所以不能先排序再查找。所以想到查询最快的hash表,记录每个元素是否使用,对每个元素,往左右扩张,直到不连续为止。代码#include <iostream>#include <unordered_map>#includ原创 2016-05-12 17:46:21 · 5312 阅读 · 0 评论 -
GEEK编程练习— —字符替换
题目实现一个函数,把字符串中的每个空格替换成“%20”。输入There are no spaces.输出There%20are%20no%20spaces.分析这是道题挺简单的,写出来是为了强调思路,有时候正着不行就得倒着来~首先,我们经常在网址中发现%20这样的字眼,这是因为在URL参数中含有特殊字符,如空格等,可能导致服务器无法获得正确的参数,所以要把特殊符号转换为服务器可识别的字符,转换规则是原创 2016-05-03 21:45:20 · 3505 阅读 · 0 评论 -
GEEK编程练习— —最长相同的子串
题目输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及首字符的位置。 输入yyabcdabjcabceg输出abc3解析首先声明一下,假如字符串为aaaaaa,答案应该为aaaaa。两个个等长的子串可以有部分字符重叠。以abcab为例子分析如下: 首先寻找长度为4的子串,只能是abca和bcab,再查看这两个子串是否有其他相同的子串。有的话直接输出结果并退出程原创 2016-05-02 19:03:14 · 5281 阅读 · 0 评论 -
GEEK编程练习— —连续出现最多子串
题目求一个字符串中连续出现次数最多的子串如果字符串是abcbcbcabc,这个连续出现次数最多的子串是bc,连续出现次数为3次。如果类似于abcccabc,则连续出现次数最多的子串为c,次数也是3次。输入abcbcbcabc输出bc3解析原创 2016-05-01 14:54:41 · 4224 阅读 · 0 评论 -
GEEK编程练习— —zigzag矩阵
题目输入矩阵规模N,输出zigzag矩阵。 zigzag顺序为下图所示 输入5输出 0 1 5 6 14 2 4 7 13 15 3 8 12 16 21 9 11 17 20 2210 18 19 23 24原创 2016-04-21 20:58:57 · 2175 阅读 · 0 评论 -
GEEK编程练习— —两个已序数组的中值
题目给定两个已经排序好的数组,找到两者的中值。分析首先把这个问题可以化成一般形式,寻找两个已序数组中所有元素的第k大元素。 1、最直接的解法,合并两个数组然后求第k大的元素。但是我们仅仅需要第k大的元素,不需要排序这么“昂贵”的操作。 2、可以用一个计数器,记录当前已经找到第m大的元素了。同时使用两个指针pA和pB,分别指向A和B数组的第一个元素,如数组A当前元素小,则pA++,同时m++;如数原创 2016-04-19 16:47:34 · 984 阅读 · 0 评论 -
GEEK编程练习— —旋转排序数组中的查找
题目假设一个已经排好序的数组,在某一个点进行了旋转,这个点不可知(如0,1,2,4,5,6,7旋转后变为4,5,6,7,0,1,2)。 输入整数n,如果n在数组里,返回n在数组中的索引,否则返回-1分析一般使用二分查找,要注意左右边界的确定。还要考虑到重复元素的存在。代码//Date:2016-04-18//Author:Sin_Geek//时间负责度O(n),空间复杂度O(1)#includ原创 2016-04-19 15:34:05 · 682 阅读 · 0 评论 -
GEEK编程练习— —数组去重
数组消除重复元素的题目一般来说都是最基本的,没什么太大的难度,而且大部分时候直接使用STL算法或容器的性质就可搞定。让我们来看题目吧~题目一输入一个已经排好序的数组,去除重复元素,输出新数组的长度。 要求:在连续的内存中进行操作,不要分配额外的内存空间给另一个数组。 举栗:输入[1,1,2],输出2。分析如果可以额外创建容器,可以使用set,先把vector的值给set,然后再传回来。因为set原创 2016-04-06 16:55:58 · 968 阅读 · 0 评论 -
GEEK编程练习— —最长回文子序列LPS
最长回文子序列LPS(Longest Palindromic Subsequence)也是编程题目里面经常出现的一种,但是更经常出现的是最长回文子串(Longest Palindromic Substring),英文简写都是LPS,所以在搜索的时候不要搞混了。 主要区别 子串是连续的,字符之间不能有间隔;而子序列可以是不连续的。如字符串cabbeaf,它的最长回文子串是bb,而最长回文子序列是a原创 2016-04-05 00:14:39 · 932 阅读 · 0 评论 -
GEEK编程练习— —螺旋矩阵
今天的题目是一道回型矩阵的题目,也可以称为蛇形矩阵。输入一个正整数n,输出一个如下的回型矩阵 n=1的回型矩阵 1n=2的回型矩阵 1 2 4 3n=3的回型矩阵 1 2 3 8 9 4 7 6 5n=4的回型矩阵 1 2 3 4 1原创 2016-04-04 10:43:02 · 1272 阅读 · 0 评论