[编程题] 删数
时间限制:1秒
空间限制:32768K
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
输入描述:
每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。
输出描述:
一行输出最后一个被删掉的数的原始下标位置。
输入例子1:
8
输出例子1:
6
解法一:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n > 1000)
n = 1000;
vector<int> vec(n,0);
int count = 0,num = n,flag = 0;
while(1){//注意当n = 1时,要进入循环输出0
for(int i=0;i<n;i++){
if(vec[i] == 1)
continue;
count++;
if(count == 3){
count = 0;
num--;
vec[i] = 1;
}
if(num == 1 && vec[i]==0){
cout<<i<<endl;
flag = 1;
break;
}
}
if(flag)
break;
}
}
}
解法二:
#include <iostream>
#include <queue>
using namespace std;
int main(){
int n;
while(cin>>n){
queue<int> que;
for(int i=0;i<n;i++)
que.push(i);
int count = 0;
while(que.size() != 1){//注意当n = 1时,要进入循环输出0
if(count != 2){
count++;
int v = que.front();
que.pop();
que.push(v);
}else{
count = 0;
que.pop();
}
}
cout<<que.front()<<endl;
}
}
[编程题] 字符集合
时间限制:1秒
空间限制:32768K
输入一个字符串,求出该字符串包含的字符集合
输入描述:
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
输出描述:
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
输入例子1:
abcqweracb
输出例子1:
abcqwer
解题思路:通过简单hash即可AC。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
if(str.size() == 0)
break;
int temp[256] = {0};
for(int i=0;i<str.size();i++){
if(temp[str[i]] == 0){
cout<<str[i];
temp[str[i]] = 1;
}
}
cout<<endl;
}
}