【面试笔试算法】牛客网一站通Offer编程题2016.4.19
牛客网一站通offer
(一)字符串变形
1. 题目:
对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像”Hello
World”一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如”Hello
World”变形后就变成了”wORLD hELLO”。
输入描述:
给定一个字符串s以及它的长度n(1≤n≤500)
输出描述:
请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
输入例子:
“This is a sample”,16
输出例子:
“SAMPLE A IS tHIS”
2. 解题
这道题看上去不是很难,可是很多边界问题 需要考虑。
比如:##this#is#a#sample## 返回 ##SAMPLE#A#IS#THIS##,而不是SAMPLE#A#IS#THIS。(Tips:#代表空格)
本题的思路:首先将字符串大小写进行替换,然后反转整个字符串,最后反转每个单词,其他的不改变。
Accepted代码:
class Transform {
public:
string trans(string s, int n) {
// write code here
//大小写替换
for(int i = 0 ; i < n ;i++){
if(s[i]>='a'&&s[i]<='z'){
s[i] = toupper(s[i]);
}
else if(s[i]>='A'&&s[i]<='z'){
s[i] = tolower(s[i]);
}
}
//反转整个字符串
reverse(s.begin(),s.end());
auto pbegin = s.begin();
auto pend = s.begin();
while(*pend!='\0'){
if(*pend == ' '){
//碰到空格则反转单词
reverse(pbegin,pend);
pbegin = pend+1;
}
++pend;
}
//处理边界情况,字符串末尾的单词需要反转
reverse(pbegin,pend);
return s;
}
};
(二)地域划分
1.题目
现在有一块长条形的土地,这个土地我们可以看成是由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]
2. 解题
按照自己的划分(有n+1种划分),依次逐位和专家的划分进行对比,求出最小值。
例如:
我的划分 | 专家划分1 | 专家划分2 | 专家划分3 | 结果 |
---|---|---|---|---|
1111 | 1111 | 0000 | 1011 | 5 |
0111 | 1111 | 0000 | 1011 | 6 |
0011 | 1111 | 0000 | 1011 | 5 |
0001 | 1111 | 0000 | 1011 | 6 |
0000 | 1111 | 0000 | 1011 | 7 |
故输出为[0,1]
Accpeted代码:
class Partition {
public:
vector<int> getPartition(const vector<vector<int> >& land, int n, int m) {
// write code here
int min = 10000000;
int idx = -1;
for(int i = -1 ; i < n ; i++){
int count = 0;
for(int j = 0 ;j < m ; j++){
int ps = i;//我的划分
int pe = i+1;
while(ps>=0) {//左边区域对比
if(land[j][ps] == 1){
count++;
}
ps--;
}
while(pe<n) {//右边区域对比
if(land[j][pe] == 0){
count++;
}
pe++;
}
}
if(count<min){//保存最小值
min = count;
idx = i;
}
}
vector<int> ret;
ret.push_back(idx+1);
ret.push_back(idx+2);
return ret;
}
};
(3) 树上最长单色路径
1. 题目
对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。你需要找到这棵树上最长的单色路径。
给定一棵二叉树的根节点(树的点数小于等于300,请做到O(n)的复杂度),请返回最长单色路径的长度。这里的节点颜色由点上的权值表示,权值为1的是黑点,为0的是白点。
2. 解题
这题用动态规划来求解。需要用到一对引用传值(white和black)来记录每个节点的左右孩子节点的黑白路径长度值传递上来。
如:lhswhite ,lhsblack ,rhswhite,rhsblack分别表示两个孩子节点的黑白最长路径长度
分两类情况:
(1)当父节点为黑时:其white = 0,black = max(lhsblack+1,rhsblack+1),它的最长单色路径长度为lhsblack+rhsblack+1;
(2)当父节点为白时:其black = 0,white = max(lhswhite+1,rhswhite+1),它的最长单色路径长度为lhswhite+rhswhite+1;
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class LongestPath {
public:
int ret=0;
int findPath(TreeNode* root) {
// write code here
int white = 0,black =0;
dfsPath(root , white , black);
return ret;
}
void dfsPath(TreeNode* root , int &white , int &black){
if(root->left == NULL && root->right == NULL){
if(root->val == 1){
white = 0;black = 1;
}
else{
white = 1;black = 0;
}
}
else{
int lhswhite = 0,lhsblack =0;
int rhswhite = 0,rhsblack =0;
if(root->left != NULL) dfsPath(root->left,lhswhite,lhsblack);
if(root->right !=NULL) dfsPath(root->right,rhswhite,rhsblack);
if(root->val ==1){
if(lhsblack+rhsblack+1>ret) ret = lhsblack+rhsblack+1;
white = 0;
black = lhsblack+1>rhsblack+1?lhsblack+1:rhsblack+1;
}
else{
if(lhswhite+rhswhite+1>ret) ret = lhswhite+rhswhite+1;
black = 0;
white = lhswhite+1>rhswhite+1?lhswhite+1:rhswhite+1;
}
}
}
};
(四)串珠子
1. 题目
现在A和B在玩一个游戏,这个游戏首先给了他们很多珠子,珠子有两种颜色,一种蓝色,一种黄色,我们假定两种珠子都有无限多。A需要选择n颗珠子(n为奇数),然后由B串成一串项链(顺序由B确定,这里的项链也就是一个环)。假如在最后串成的项链中,A能够找到两个不同位置的蓝色珠子,并在这两处把这个项链断开成两段,其中一段恰好长度为(n+1)/2那么A就胜利了,注意这里为整数截断除法且这个长度是不包括选出的两颗珠子的。现在请你计算出A至少要选择多少颗蓝色珠子,才能保证无论B怎么串,他都能获胜。举个例子,当A选了7颗珠子,其中有3颗蓝珠子,那么如果B串的项链为”蓝蓝红红红红蓝”,则A能获胜,若B串的项链为”蓝蓝红红蓝红红”,则A不能获胜。
2. 解题
这是一题找规律的题目。
class Chain {
public:
int findK(int n) {
// write code here
if(n%3==0) return n/2;
else return (n+1)/2;
}
};
【面试笔试算法】牛客网一站通Offer编程题2016.4.19的更多相关文章
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- 【面试笔试算法】Problem 7: 补提交卡(hiho题库)
时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去了,小Ho查看自己的提交 ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
- 数组中只出现过一次的数字 牛客网 剑指Offer
数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...
- 数组中出现次数超过一半的数字 牛客网 剑指Offer
数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
- 数字在排序数组中出现的次数 牛客网 剑指Offer
数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...
- 数值的整数次方 牛客网 剑指Offer
数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...
- 按之字形顺序打印二叉树 牛客网 剑指Offer
按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...
随机推荐
- Swift基础之CoreData的使用
以前使用过OC版本的CoreData应该很好理解Swift方式,所以这里简单的展示一下,增删改查的方法使用,同时给大家说一下创建步骤,方便大家的使用,转载请注明出处,谢谢~ 步骤一:创建一个Swift ...
- Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍 ...
- 安卓高级Fresco图片框架的时候
Fresco:2015FaceBook推出的 及其强大 支持webp图片格式 和渐进式图片加载 中文文档 使用方法 引入依赖 点击查看具体教程 基本使用步骤 在布局中使用其标签 <com.fac ...
- 【Android】给Android Studio设置代理
先打开我们的Android Studio,点击工具栏的file下的settings,如下图 之后再搜索框上面输入Proxy,然后按第四步提示点击,如下图 之后就进入了设置代理的界面了,如下图 默认情况 ...
- git中status指令总是提示内容被修改的解决
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在用git提交项目修改时发现一个问题,就是多次 git a ...
- XMPP系列(七)---获取群组列表
上一篇介绍了如何创建群组,这一篇就介绍一下,如何获取自己的群组列表. 在上一篇有提到,如果我们创建的群组是公共的群组,那么获取自己的群组列表时,会获取到自己的群组列表和那些公共的群组.而实际做社交的应 ...
- (一二四)tableView的多组数据展示和手动排序
最近在写一个轻量级的网络游戏,遇到了技能优先顺序手动排序的需求,我就想到了iOS自带的tableView编辑功能,对其进行了初步探索,最后做出的效果如下图所示: 点击左边可以删除,拖住右边可以手动排序 ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- 怎样在Ubuntu 14.04中搭建gitolite git服务器
1. 首先这里我们安装openssh-serveropenssh-client,如果你用的是VPS之类的一般都默认安装好了,不过运行一个这个命令不会有错的,如果有安装就会提示已安装. sud ...
- Hibernate进阶知识点必备
hibernate.cfg.xml的常用的配置 hibernate.show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试,为true的好 -hibernate.f ...