算法初步:逆序数
问题描述
在线性代数里有这么一个概念:有一个数列,如21543,
1的前面有1个数比它要大,4的前面有1个数比它大,
3的前面有2个数比它大,总数是1+1+2=4
所以21543的逆序数就是4
输入
多组测试数据,第一行是n(1<=n<=1e7),下一行是一个长度为n的字符串
输出
算出这个字符串的逆序数(ASCII比较)
样例输入
5
21543
3
123
6
654321
4
acdb
6
abcABC
4
2211
样例输出
4
0
15
2
9
4
难度:☆
代码实现如下:
点评:主要使用了一个函数cin.get(),以前还真没有接触过。它的主要特点是保留回车在输入流队列中,输入A,会按A 回车,cin.get()会把回车('\n')当作字符读了。所以在cin后,又加了一个cin.get().
在线性代数里有这么一个概念:有一个数列,如21543,
1的前面有1个数比它要大,4的前面有1个数比它大,
3的前面有2个数比它大,总数是1+1+2=4
所以21543的逆序数就是4
输入
多组测试数据,第一行是n(1<=n<=1e7),下一行是一个长度为n的字符串
输出
算出这个字符串的逆序数(ASCII比较)
样例输入
5
21543
3
123
6
654321
4
acdb
6
abcABC
4
2211
样例输出
4
0
15
2
9
4
难度:☆
代码实现如下:
1 #include<iostream>
2 using namespace std;
3 int main(void)
4 {
5 int i,n,Sum;
6 while(cin >> n)
7 {
8 cin.get();//为什么呢?
9 Sum = 0;
10 char *str = new char[n];
11 for(i=0;i < n;i ++)
12 {
13 int j;
14 cin.get(str[i]);//与str[i] = cin.get()相同效果
15 for(j= 0;j < i;j ++)
16 {
17 if(str[j] > str[i])
18 {
19 Sum ++;
20 }
21 }
22 }
23 cout << Sum << endl;
24 delete [] str;
25 }
26 return 0;
27 }
2 using namespace std;
3 int main(void)
4 {
5 int i,n,Sum;
6 while(cin >> n)
7 {
8 cin.get();//为什么呢?
9 Sum = 0;
10 char *str = new char[n];
11 for(i=0;i < n;i ++)
12 {
13 int j;
14 cin.get(str[i]);//与str[i] = cin.get()相同效果
15 for(j= 0;j < i;j ++)
16 {
17 if(str[j] > str[i])
18 {
19 Sum ++;
20 }
21 }
22 }
23 cout << Sum << endl;
24 delete [] str;
25 }
26 return 0;
27 }
点评:主要使用了一个函数cin.get(),以前还真没有接触过。它的主要特点是保留回车在输入流队列中,输入A,会按A 回车,cin.get()会把回车('\n')当作字符读了。所以在cin后,又加了一个cin.get().