“一战通offer”互联网实习季编程挑战
1、字符串变形
对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如"Hello World"变形后就变成了"wORLD hELLO"。
输入描述:
给定一个字符串s以及它的长度n(1≤n≤500)
输出描述:
请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
输入例子:
"This is a sample",16
输出例子:
"SAMPLE A IS tHIS"
代码如下:
class Transform { public: string trans(string s, int n) { string tmp; int cnt=0; for(int i=n-1;i>=0;i--){ if(s[i]>='a' and s[i]<='z') s[i]=toupper(s[i]); else if(s[i]>='A' and s[i]<='Z') s[i]=tolower(s[i]); else if(s[i]==' '){ tmp+=s.substr(i+1,cnt); tmp+=' '; cnt=0; continue; } cnt++; if(i==0){ if(s[i] != ' '){ tmp+=s.substr(i,cnt); } } } return tmp; } };
2、地域划分
现在有一块长条形的土地,这个土地我们可以看成是由n块小方格连接而成的(这些小方格我们可以将之编号为1到n)。而我们需要将其划分成两个部分,分别种上不同的作物(即作物A和B),划分必须在某两个小方格之间进行,或者在土地的最左端或最右端,若划分在第i块到第i+1块间进行,则划分后,第1至第i块地种A,剩下的地种B。现在有一些专家对土地进行了检测,他们每个人评估了每块土地适合种的作物。请你找到一个合适的划分,使得其与所有专家的评估最吻合,也就是说,你划分到A而专家评估为B的次数和你划分到B而专家评估为A的次数之和最小。
输入描述:
每组数据给定一个专家评估表land(其中0为评估A,1为评估B),以及小块数量n(1≤n≤300),专家评估次数m(1≤m≤300)
输出描述:
请返回你的划分,即i和i+1。若在最左端,则输出0,1;在最右端则输出n,n+1。若有多解输出最靠左的划分。
输入例子:
[[1,1,1,1],[0,0,0,0],[1,0,1,1]],4,3
输出例子:
[0,1]
代码如下:
3、树上最长单色路径
对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。你需要找到这棵树上最长的单色路径。
给定一棵二叉树的根节点(树的点数小于等于300,请做到O(n)的复杂度),请返回最长单色路径的长度。这里的节点颜色由点上的权值表示,权值为1的是黑点,为0的是白点。
代码如下:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class LongestPath { public: int res=0; void path(TreeNode*root,int &black,int &white) { if(root->left==NULL&&root->right==NULL) { if(root->val==1) black=1,white=0; else black=0,white=1; } else { int leftb=0,leftw=0,rightb=0,rightw=0; if(root->left) path(root->left,leftb,leftw); if(root->right) path(root->right,rightb,rightw); if(root->val==1) { if(leftb+rightb+1>res) res=leftb+rightb+1; white=0; black=leftb+1>rightb+1?leftb+1:rightb+1; } else { if(leftw+rightw+1>res) res=leftw+rightw+1; black=0; white=leftw+1>rightw+1?leftw+1:rightw+1; } } } int findPath(TreeNode* root) { // write code here if(root==NULL) return 0; int black_1=0,white_0=0; path(root,black_1,white_0); return res; } };
4、串珠子
现在A和B在玩一个游戏,这个游戏首先给了他们很多珠子,珠子有两种颜色,一种蓝色,一种黄色,我们假定两种珠子都有无限多。A需要选择n颗珠子(n为奇数),然后由B串成一串项链(顺序由B确定,这里的项链也就是一个环)。假如在最后串成的项链中,A能够找到两个不同位置的蓝色珠子,并在这两处把这个项链断开成两段,其中一段恰好长度为(n+1)/2那么A就胜利了,注意这里为整数截断除法且这个长度是不包括选出的两颗珠子的。现在请你计算出A至少要选择多少颗蓝色珠子,才能保证无论B怎么串,他都能获胜。举个例子,当A选了7颗珠子,其中有3颗蓝珠子,那么如果B串的项链为"蓝蓝红红红红蓝",则A能获胜,若B串的项链为"蓝蓝红红蓝红红",则A不能获胜。
输入描述:
给定一个整数n,为A要选出的珠子颗数.
输出描述:
请返回A至少要选的蓝珠子颗数。
输入例子:
7
输出例子:
4
代码如下:
class Chain { public: int findK(int n) { if(n % 3 == 0) return (n-1)/2; else return (n+1)/2; } };