目录
竖读
题目
输入n行字符串数字(1<=n<=9),字符串数字的长度范围为1-10^5.
请将每一列的数读出来,并从小到大排序后,以空格间隔输出。
示例1:
输入:
3
0123
1234
2345
输出:
12 123 234 245
思路
这比较基础,使用一个string储存字符串数字,然后遍历每一列计算出每一列的结果存到vector容器中
代码
#include
#include
#include
#include
using namespace std;
bool cmp(int a, int b)
{//返回true不交换,false交换
return a < b;
}
vector solve(int n, string s[])
{
vector res;
int length = s[0].size(); //字串长度
for (int i = 0; i < length; i++)
{
int res_t = 0;
for (int j = 0; j < n; j++)
{
res_t = 10 * res_t + (s[j][i] - '0');
}
res.push_back(res_t);
}
//排序
//sort(res, res +length); // 从小到大
//sort(res.begin(), res.begin() + length, greater()); //从大到小
sort(res.begin(), res.begin() + length, cmp); //从小到大
return res;
}
//竖读
int main()
{
int n; //输入数据的行数,也即结果的最大长度
cin >> n;
string s[n]; //保存每一行的数据
for (int i = 0; i < n; i++)
cin >>s[i];
vector res = solve(n, s);
for (auto a : res)
cout << a << ' ';
}
质数下标
题目
有一个长度为n的数组a,数组下标从1~n。每一次会将a中所有下标为非质数的元素进行删除,即a且i不为质数。在删除完之后,将数组a重新按顺序拼接起来。不断循环这个过程,直至数组a的大小为1。求这个数组最后剩下的那个元素的值是多少。
示例:
输入:
[1, 2, 3, 4]
输出:
3
解释:
第一次变成[2,3]
第二次变成[3]
思路
主要是质数的判断,不是质数,则删除该下标的值
方案1:当数组长度大于1时,循环从数组后向前寻找需要删除的数(在这每次都需要调用质数的判断),最后更新数组长度,继续删除直到数组长度为1
方案2:使用vector来保存需要删除的非质数下标,后面只需判断此时的下标是否在vector中,在则删除
方案3:将vector换成unordered_map(基于哈希表,查找速度快)来保存非质数。
方案4:可以用map来存下标和删除标志位的键值对比如(1,true)表示1位置需要删除。
vector和map, map和unordered_map
代码
#include
#include
#include
#include
#include
攻与防
题目
有n个战士,编号为1-n,战士的战斗力等于它的编号。寻找一个pos,将n个战士分成两个阵营,编号1-pos为第一个阵营,pos+1-n为第二个阵营,pos为0时,第一个阵营没战士,所有战士在第二阵营。假设第一个阵营为进攻方,第二个为防守方,进攻方能够进攻的总战斗力为w,防守方能够防守的总战斗力为v,我们希望w和v的差值最小,请找出pos。(相当于进攻方的防守战士不能提供攻击力,防守方的进攻战士不能提供攻击力)
输入:
第一行n,表示战士的数量。
第二行给出一个字符串s,由0和1组成,0表示这个战士只能进攻,1表示只会防守。
输出:
abs(w-v)的最小值
示例:
输入:
7
1000101
输出:
2
解释:
pos为第5个位置,进攻方w=2+3+4 = 9,防守方v=7.最后w-v = 2.
思路
先计算出pos为0时的w值和v值,然后移动pos位置,更新w和v,然后寻找一个最小的差值。
代码
#include
#include
#include
#include
#include