✅作者简介:C/C++领域新星创作者,CSDN内容合伙人
✨个人社区:微凉秋意社区
🔥系列专栏:剑指offer精讲
📃推荐一款模拟面试、刷题神器👉注册免费刷题
🔥前言
今天分享牛客网《剑指offer》专栏里的经典数组算法题的题解,从解题思路到具体代码解释步步到位。
由题目可以得知打印的结果取决于n的值且和10的倍数有密切关联:
所以我们可以定义一个值为1的辅助数字,根据n的值来让辅助数字乘以不同数量的10
然后从1到辅助数字进行循环,将结果依次存入一个数组即可
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型 最大位数
* @return int整型vector
*/
vector<int> printNumbers(int n) {
// write code here
vector<int>res;
int flag=1;
for(int i=1;i<=n;i++)
flag*=10;
for(int i=1;i<flag;i++)
res.push_back(i);
return res;
}
};
res
,这是最终用来返回的整数列表flag
是辅助数字,利用for循环来确定辅助数字的最终值res
,算法结束注意题目要求:奇数之间与偶数之间的相对位置不变,那么我的解题思路是:
vector
容器,对原数组里的元素值判断:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> reOrderArray(vector<int>& array) {
// write code here
if(array.size()==0||array.size()==1)
return array;
vector<int>os;
vector<int>js;
for(int i=0;i<array.size();i++){
if(array[i]%2==0)
os.push_back(array[i]);
else
js.push_back(array[i]);
}
for(int i=0;i<os.size();i++){
js.push_back(os[i]);
}
return js;
}
};
os
和js
分别代表偶数和奇数容器这一题不要求奇数间或者偶数间的位置了,因此可以采取元素交换的方法:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> reOrderArrayTwo(vector<int>& array) {
// write code here
int i=0;
while(i<array.size()){
if(array[i]%2==0){
int flag=i+1;
while(array[flag]%2==0){
flag++;
}
if(flag>=array.size())
return array;
int temp=array[i];
array[i]=array[flag];
array[flag]=temp;
}
i++;
}
return array;
}
};
while
循环结束的条件就是下标超过限制flag
,并通过内层的while
循环来找到第一个奇数的位置return
返回即可i++
,继续往后遍历,超过数组限制后也要利用return
返回那么《剑指offer》专栏之数组专精的分享到此结束了,觉得写的好的朋友可以点赞鼓励一下哈,我们下篇再见!