只做了两个,第一个90分(实在想不出错在哪里...谁能给个测试用例不?),第二个40分(其实已经发现问题了,等要再改时间不够失去修改的动力了...)
题目1 : String reorder
思路是:HASH计数,按计数排序输出
#include <iostream>
#include <string>
using namespace std;
int num[10];
int alpha[26];
void init()
{
for(int i=0;i<10;i++)
{
num[i]=0;
}
for(int i=0;i<26;i++)
{
alpha[i]=0;
}
}
void output(int size)
{
while(size){
for(int i=0;i<10;i++)
{
if(num[i]>0)
{
cout<<i;
num[i]--;
size--;
}
}
for(int i=0;i<26;i++)
{
if(alpha[i]>0)
{
cout<<(char)('a'+i);
alpha[i]--;
size--;
}
}
}
if(size==0)
cout<<endl;
}
void func()
{
string s;
while(cin>>s)
{
init();
bool flag=true;
int size=s.size();
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
num[s[i]-'0']++;
}else
if(s[i]>='a'&&s[i]<='z')
{
alpha[s[i]-'a']++;
}else
{
flag=false;
}
}
if(flag==false)
{
cout<<"<invalid input string>"<<endl;
}
else
{
output(size);
}
}
//getchar();
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}
题目2 : K-th string
思路:
1可以考虑全排列,将重复的剔除,然后排序输出(一上来想到的方法,结果自己看了下m+n,k数字,怕太大,没这样写下去 ....)
2考虑000011111,111110000最小,最大值,这两个范围的整数,从最小值顺序遍历到最大值,利用其含二进制1的个数判断是否为m,来确定是否属于该string集合,然后数到第k个
3考虑从000011111,按照字典序依次递增到111110000(我最后选择了这个思路,但没有写完整,如果在保持01个数的情况下形成字典序,需要找到规律对01进行swap)// by zjerry 待补充
题目3 : Reduce inversion count
思路:
1按例子上的说明最直接的想法是,每swap两个数字后就计算一下逆序数(或者只计算
这两个数和他们之间的数的逆序数变化),然后求出最小值(看了题目,没有动笔...稍微想了下因为swap两个数字是组合O(n^2),然后求逆序数至少也要O(nlogn),这...我又怕超时没敢写)
2