概述
目录
Day15-学习内容:
1.剑指Offer
面试题29:顺时针打印矩阵
面试题21:调整数组顺序使奇数位于偶数前面
2.Leetcode
例1:求字符串最后一个单词的长度
例2:求二进制字符串的和
3.2018年校招编程题
例1:今日头条-判断三只球队能否打平
例2:今日头条-求最大连续相同字符的子串长度
4.2017年阿里巴巴秋招笔试题
1.剑指Offer
面试题29:顺时针打印矩阵
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:1.每次打印一个矩形用循环实现,矩形的起始位置总是左上角的点,坐标:(start,start)即行列标相等,循环条件:rows>start*2&&columns>start*2。
2.矩形打印分四步,第一步从左到右,总是需要至少会打印一步;第二步从上到下,应满足start<endR即起始行号小于终止行号;第三步从右到左,应满足start<endR&&start<endC即起始行号小于终止行号且起始列号小于终止列号;第四步从下到上,应满足start<endC&&start<endR-1即终止行号要比起始行号至少大2且起始列号小于终止列号。
代码:
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int rows=matrix.size();
int columns=matrix[0].size();
vector<int> res(rows*columns);
res.clear(); //一定要清空,否则会有默认的0出现
int start=0;
while(rows>start*2&&columns>start*2){ //print a rectangle
printMatrixCore(matrix,rows,columns,start,res);
++start;
}
return res;
}
void printMatrixCore(vector<vector<int> > &matrix, int rows, int columns, int start, vector<int> &res){
int endC=columns-1-start;
int endR=rows-1-start;
for(int i=start;i<=endC;i++){ //print from left to right
res.push_back(matrix[start][i]);
}
if(start<endR){ //print top to bottom
for(int i=start+1;i<=endR;i++){
res.push_back(matrix[i][endC]);
}
}
if(start<endR&&start<endC){ //print right to left
for(int i=endC-1;i>=start;i--){
res.push_back(matrix[endR][i]);
}
}
if(start<endC&&start<endR-1){ //print bottom to top
for(int i=endR-1;i>=start+1;i--){
res.push_back(matrix[i][start]);
}
}
}
};
面试题21:调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
代码:
方法1:
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array.empty()||array.size()==0){
return;
}
Reorder(array,isEven);
}
static void Reorder(vector<int> &array, bool (*func)(int)){
int i=0;
int j=array.size()-1;
int temp;
while(i<j){
while(i<j&&!func(array[i])){
++i;
}
while(i<j&&func(array[j])){
--j;
}
if(i<j)
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
static bool isEven(int n){
return (n&1)==0;
}
};
结果:您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%
用例:
[1,2,3,4,5,6,7]
对应输出应该为:
[1,3,5,7,2,4,6]
你的输出为:
[1,7,3,5,4,6,2]
原因在于:没有保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法2:
思路:类似冒泡算法,前偶后奇数就交换
class Solution {
public:
void reOrderArray(vector<int> &array) {
for(int i=0;i<array.size();i++){
for(int j=array.size()-1;j>i;j--){
if((array[j]%2==1)&&(array[j-1]%2==0)){
swap(array[j],array[j-1]);
}
}
}
}
};
2.Leetcode
例1:求字符串最后一个单词的长度
题目描述:
Given a string s consists of upper/lower-case alphabets and empty space characters' ', return the length of last word in the string.
If the last word does not exist, return 0.
Note: A word is defined as a character sequence consists of non-space characters only.
For example,
Given s ="Hello World",
return5.
思路:反向查找,末尾空格忽略,行中出现空格就终止循环,注意一定要考虑末尾有空行的情况。
解析:strlen函数
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括'