题目描述:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2,7,0,6,9},结果为{5,1,7,9,4,2,0,6}

题目分析:

题目要求分开奇数和偶数,还需要保持奇数和偶数相对顺序不变,首先想到的是采用两个额外数组分别存奇数和偶数,然后将两个额外数组按奇数在前,偶数在后连接到一起,但是由于未知奇数和偶数的数量,我们申请的两个额外数组为保险起见都设为和原数组一样长,这就造成了空间上的浪费,可不可以更加优化一点,我们采用一个数组,从头往后检索原数组,如果是奇数,则置入新申请的数组,为了降低时间复杂度,我们同时设置一根指针从后往前同时检索,遇到偶数则倒着插入额外申请的数组,这样在o(n)的时间复杂度内可以实现该算法

下面是代码:

#include<iostream>
using namespace std; void OddEven(int A[],int B[],int len) {
int j = ;
for (int i = ; i < len;++i) {
if (A[i]% == ) {
B[j] = A[i];
j = j + ;
}
}
int k = len - ;
for (int i = len - ; i >= ; --i) {
if (A[i]%==) {
B[k] = A[i];
k = k - ;
}
}
for (int i = ; i < len; ++i) {
cout << B[i]<<endl;
}
} int main() {
int A[] = {,,,,,,,};
int B[];
int len = ;
OddEven(A, B, len);
return ;
}

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4x4矩阵,

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

题目分析:对矩阵来说,我们需要对各种情况分析,从下面图可以看出,最外层按圈的方式遍历,最里面会出现很多种情况

我们采用顺序遍历的方式,首先从左往右,然后从上往下,从右回到左,从下回到上,一轮下来,外环走完,第二轮从内环遍历,左和上初始条件加一,右和下初始条件减一,结束条件是左边界超过右边界以及上边界超过下边界,下面是代码:

#include<iostream>
#include<vector>
using namespace std; vector<int> CircleValue(vector<vector<int>> matrix) {
int row = matrix.size();
int col = matrix[].size();
int left = ;
int right = col - ;
int top = ;
int bottom = row - ;
vector<int> result;
while (left<=right&&top<=bottom) {
for (int i = left; i <= right;i++) {
result.push_back(matrix[top][i]);
}
for (int j = top+; j <= bottom; ++j) {
result.push_back(matrix[j][right]);
}
if (top!=bottom) {
for (int i = right - ; i >= left;--i) {
result.push_back(matrix[bottom][i]);
}
}
if (left!=right) {
for (int j = bottom - ; j > top;--j) {
result.push_back(matrix[j][left]);
}
}
left++; top++; right--; bottom--;
}
return result;
} int main() {
vector<vector<int>> arr;
int row;
int col;
cin >> row >> col;
arr.resize(row); for (int i = ; i < row; i++){
arr[i].resize(col);
}
    cout << "请输入数组元素:" << endl;

    for (int m = ; m < row; m++){
for (int n = ; n < col; n++){
cin >> arr[m][n];
}
}
vector<int> B;
B = CircleValue(arr);
vector<int>::iterator t;
for (t = B.begin(); t != B.end(); t++)
cout << *t << " ";
}

C++向量补充知识:

向量是重要的数据结构,和数组有很多相似的地方

向量声明#include<vector>

首先是一维向量性质:

vector<int> arr = {1,2,3,4,5,6,7,8};

arr.size()返回向量长度

arr.empty()判断向量是否为空

arr.begin()向量的第一个元素

arr.end()向量的最后一个元素

arr.insert(arr.begin(),1000)将1000插到向量初始值前面

arr.clear()清空向量

arr.ease(arr.begin(),arr.end())删除开始到结尾这个区间的值

arr.push_back()往向量中压入一个值

arr.pop()默认弹出最后一个值

一维向量输出的两种方法:

vector<int>::iterator t;
for (t = arr.begin(); t != arr.end(); t++)
cout << *t << " ";
for (int i = ; i < arr.size(); i++)
cout << B[i] << " ";

对于二维向量:

二维向量扩容(row,col)

arr.resize(row);
for (int i = ; i < row; i++)
{
arr[i].resize(col);
}

二维数组赋初值

vector<vector<int>> arr = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

二维数组输出

for (int i = ; i < arr.size(); i++)
for(int j=;j<arr[].size();j++)
cout << arr[i][j] << " ";

参考:

https://www.cnblogs.com/wanglei5205/p/8617424.html(剑指offer方法)

https://blog.csdn.net/qq_36427732/article/details/79652430(向量使用方法)

剑指offer自学系列(三)的更多相关文章

  1. 剑指offer题目系列三(链表相关题目)

    本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...

  2. 剑指offer自学系列(二)

    题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的 ...

  3. 剑指offer自学系列(一)

    题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...

  4. 剑指offer自学系列(五)

    题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  5. 剑指offer自学系列(四)

    题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...

  6. 《剑指offer》总结三 之二叉树(2)

    目录 23.二叉搜索树的后序遍历序列 26.二叉搜索树与双向链表(31ms,5756k) 23.二叉搜索树的后序遍历序列 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...

  7. 剑指offer题目系列二

    本篇延续上一篇,介绍<剑指offer>第二版中的四个题目:从尾到头打印链表.用两个栈实现队列.旋转数组的最小数字.二进制中1的个数. 5.从尾到头打印链表 题目:输入一个链表的头结点,从尾 ...

  8. 剑指offer题目系列一

    本篇介绍<剑指offer>第二版中的四个题目:找出数组中重复的数字.二维数组中的查找.替换字符串中的空格.计算斐波那契数列第n项. 这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺 ...

  9. 《剑指offer》第三十九题(数组中出现次数超过一半的数字)

    // 面试题39:数组中出现次数超过一半的数字 // 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例 // 如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, ...

随机推荐

  1. nacos作为配置中心兼容xml配置文件

    最近公司想要用配置中心,因为公司用的有传统的spring项目,有springboot项目,为了兼容都能够采用配置中心,做了一些尝试,经过比较还是倾向于使用nacos,传统dubbo采用spring方式 ...

  2. linux 基本命令学习总结

    1. linux的目录结构  (linux核心:一切皆文件) 目录结构解释 (主要的有 /etc  /home  /mnt  /opt  /usr   /tmp) 相对路径和绝对路径的区别 绝对路径  ...

  3. 单元测试报错:unable to find a @SpringBootConfiguration

    完整异常: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBoo ...

  4. 【IMU_Ops】------III------ IMU自动化运维平台之CMDB(admin)

    说明本文中所有内容仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 首先启用admin 通过python manage.p ...

  5. 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ

    题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...

  6. 入门学习C链接

    参考链接:http://c.biancheng.net/view/465.html 在里面链接下载了:code:block,还有C语言入门的PDF文件. 常看网站:https://www.cnblog ...

  7. Linux --xrandr command

    Source: https://www.x.org/archive/current/doc/man/man1/xrandr.1.xhtml https://blog.csdn.net/syh_486_ ...

  8. 初识Prometheus

    安装Prometheus Server Prometheus基于Golang编写,编译后的软件包,不依赖于任何的第三方依赖.用户只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动Prom ...

  9. ZCGL大数据项目优化组件布置

    1.经JMeter并发性能测试,每个HBaseService服务的并发请求上限大概是1K,为了支持5W个并发请求量,需要增加部署节点,相应需要增加部署路由网管Zuul,为了隐藏多个路由网管Zuul的I ...

  10. storm正常任务数据量过大时造成定时任务不执行的问题

    在执行storm的定时任务时,发现storm普通任务数据量过大时造成定时任务不执行, 同时设置了storm的普通任务和定时任务,定时任务设置5秒执行1次. 普通任务的数据时从spout中不停发射字符串 ...