滴滴出行2016校招编程题
1. 给定一个m*n的数组(m,n>=2,数组值>=0),要求选出和最大的子2*2数组。例如:
1 2 3
4 5 6
7 8 9
显然和最大的2*2子数组是5 6;8 9.下面完成这个功能。
Input: (m*n的数组)
1 2 3 ; 4 5 6 ; 7 8 9
Output: (最大的和)
28
解析:这个问题我觉得有两个难点,第一个就是二维数组的生成,初始时刻给了我们一行字符串,格式如上。我们需要从中读取二维数组,第二个就是核心算法,这里我们使用暴力解法,两行两列地逐步向后向下推进,直到找到最大的和。
代码:
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
using namespace std;vector<string> split( string str, string pattern)//分割字符串,分隔符是pattern
{vector<string> result;str += pattern;//扩张字符串以方便操作string::size_type pos;int n = str.size();for (int i = 0; i < n;i++){pos = str.find(pattern, i);if (pos<n){string s = str.substr(i, pos - i );result.push_back(s);i = pos +pattern.size()- 1;}}return result;}
int main()
{//读取二维数组string str;getline(cin, str);vector<string> vecstr = split(str, ";");//第一次分割int m = vecstr.size();//m行int n;//列数vector<vector<int> > arr(m);for (int i = 0; i < m;i++){vector<string> vecstr2 = split(vecstr[i]," ");n = vecstr2.size();arr[i].reserve(n);for (int j = 0; j < n; j++){arr[i].push_back(atoi(vecstr2[j].c_str()));}}//找到最大的和int maxsum = 0;int row , column ;for (int i = 0; i < m - 1; i++)for (int j = 0; j < n - 1; j++){int sum = arr[i][j] + arr[i][j + 1] + arr[i + 1][j] + arr[i + 1][j + 1];if (maxsum < sum){row = i;column = j;maxsum = sum;}}cout << "最大的子数组是:" << endl;cout << arr[row][column] << "\t" << arr[row][column + 1] << endl;cout << arr[row + 1][column] << "\t" << arr[row + 1][column + 1] << endl;cout << "最大的和是" << maxsum << endl;}
结果:
1 2 3;4 5 6;7 8 9
最大的子数组是:
5 6
8 9
最大的和是28
请按任意键继续. . .
2.已知有一个数组,有正数、负数、0,要求输出和为0的最长连续子数组。
Input: -1 0 1 2 -1 -2 3 4 -4
Output: 0 1 2 -1 -2
解析:
定义i,j,让i从前往后遍历,在i确定的时候,让j从后往前遍历,直到遇到第一个为0的时候停下来,计算i,j之间的距离,然后i继续遍历,选最长的即可。同时为了节约时间,一旦有一种情形的长度超过整体长度的一半,则i只需遍历到整体的前一半即可。
代码:
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>
#include <sstream>
#include <numeric>
using namespace std;
typedef vector<int> vecint;
vecint max_subarray(string str)
{stringstream s(str);vecint data,subdata;data.reserve(str.length());int t;while (s>>t){data.push_back(t);}int n = data.size();int disnum = 0;int low=-1, high=-1;for (int i = 0; i < n;i++){if (i >= n / 2 && disnum >= n / 2){break;}int sum = accumulate(data.begin() + i, data.end(), 0);int j = n - 1;while (sum!=0&&j>=i){sum -= data[j--];}if (sum == 0 && (disnum<(j - i + 1))){disnum =j - i + 1;//子数组的长度low = i;high = j;}}if (disnum!=0){for (int k = low; k <= high; k++){subdata.push_back(data[k]);}}return subdata;}int main()
{string str;getline(cin, str);vecint subarray = max_subarray(str);if (subarray.empty()){cout << "there's not such subarray that sum equals to zero" << endl;}else{cout << "Result has founded:" << endl;copy(subarray.begin(), subarray.end(), ostream_iterator<int>(cout, " "));}
}
结果:
-1 0 1 2 -1 -2 3 4 -4
Result has founded:
0 1 2 -1 -2 请按任意键继续. . .
滴滴出行2016校招编程题相关推荐
- 京东2016校招编程题
记得有一个大题,说的是给定一个n*n的矩阵,要求从1开始填充矩阵,最后的矩阵是蛇形的.即如下: n=3, 7 8 1 6 9 2 5 4 3 n=4, 10 11 ...
- 滴滴2018秋招编程题
滴滴 2018秋招 编程题 1.寻找丑数 丑数的定义是,只包含因子2.3和5的数称作丑数.比如6和8是丑数,14不是丑数,因为含有因子7.输入一个整数n,输出第n个丑数.我们认为第一个丑数是1. 解析 ...
- 搜狗校招编程题-建房子
@[TOC][搜狗校招编程题-建房子] 题目描述 某市政府规划建设一个新的小镇,要求小镇上的所有房屋都坐落在同一条东西向大姐的北侧并且临街(两座房子不能重叠).到目前为止,这条街上已经建造了n座房子, ...
- 【vivo2021届秋季校招编程题】【java】广度优先搜索(BFS)/深度优先搜索(DFS)找最短路径长度
vivo2021届秋季校招编程题 图中 找两点间的最短路径长度 广度搜索bfs/深度搜索dfs vivo游戏中心的运营小伙伴最近接到一款新游戏的上架申请,为了保障用户体验,运营同学将按运营流程和规范对 ...
- 京东校招java面试题_京东2018校招编程题解答(Java)
写在前面 本文主要是解答这次校招中京东的笔试编程题,这次京东的笔试编程题比较难,涉及KMP算法.manacher算法等.文中的解法也是在观看了左神(左程云)9月20号在牛客网的直播后,自己花时间写出来 ...
- 微软校招编程题Beautiful String的状态机解法
昨天碰巧看到一道微软校招的编程题,题目大意如下: 如果一个字符串包括三组或者更多组的连续升序字母,每组长度相等,那么我们就称这个字符串是Beautiful String如下是一些Beautiful S ...
- 京东校招编程题——小熊分苹果
刚做完京东校招在线笔试,第一道编程题居然没做出来,开始时没想到关键点还以为题目出错了,浪费了很多时间,郁闷-- 题目如下: N(1<N<9)只熊分一堆苹果,第一只熊(叫小东)把苹果平均分成 ...
- 网易2018年春招 校招编程题
时间:2018.3.27 申请岗位:测试实习生(网易杭州)-音乐事业部 记录一下自己人生的第一次笔试吧..自己的水平还是太差了,希望以后自己翻到这篇文章的时候能够有进步. 20道选择题:其中一半都是测 ...
- 小米校招编程题:数组乘积、异形数、朋友圈
这里记录一下方便查找,原文地址:http://blog.csdn.net/hackbuteer1/article/details/8484974 二.编程题 1.数组乘积(15分) 输入:一个长度为n ...
最新文章
- Python Beautiful Soup类的基本元素
- 长短期记忆网络_昆明理工大学刘可真、苟家萁、骆钊等:粒子群优化长短期记忆网络模型如何进一步提高变压器油中溶解气体浓度的精准预测?...
- Android虚拟机和Java虚拟机的区别
- shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记
- 初识html 尝试图片标签 0907
- 计算机工程师英语介绍,数据库系统工程师计算机专业英语(四).doc
- java.nio教程_Java NIO系列教程(三) Buffer
- 多线程(一):初识多线程
- Redis 最大客户端连接数,你了解吗?
- python实现两个任意字符串乘积
- SQL Server 2008下载及安装
- easyui模板中的disabled的使用
- Android - Enable fullscreen mode
- 51单片机指令汇集,分类,以及典型指令案例分析
- linux拷贝文件和目录命令,Linux 命令 - cp: 拷贝文件和目录
- web安全工具库(笔记)----端口扫描(ScanPort.exe)
- CQC认证与3C认证的区别是什么
- 农村集体资产产权改革试点将全面展开
- SQL-小题推荐牛客8题精练版
- Dockerfile Registry WebUI 之 docker-registry-frontend 高级应用