一道经典面试题,字符数组排序问题(字符包含a-z、A-Z、0-9.)

一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,

所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序。

解析:可以将整个字符数组进行排序,然后将整个数组逆序,然后a-z、A-Z、0-9在分别逆序就可以了

  1. //一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,
  2. //所有数字放在最后,而且各部分内部分别有序。
  3. #include <iostream>
  4. #include <cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. void reverse_aA0(char arr[], unsigned int length)
  8. {
  9. sort(arr, arr + length);//使数字字符在前且内部有序, 大写字母在中间且有序, 小写字母在后面且有序
  10. reverse(arr, arr + length);// 使小写字母在前面且内部逆序, 大写字母在中间且逆序, 数字字符在后面且逆序
  11. unsigned int i = 0, j = 0;
  12. for (i=0; i < length; ++i)
  13. if (arr[i] >= ‘A‘ && arr[i] <= ‘Z‘)
  14. {
  15. break;
  16. }
  17. reverse(arr, arr + i);
  18. for (j=i; j < length; ++j)
  19. {
  20. if (arr[j] >= ‘0‘ && arr[j] <= ‘9‘)
  21. {
  22. break;
  23. }
  24. }
  25. reverse(arr + i, arr + j );
  26. reverse(arr + j, arr + length);
  27. }
  28. int main()
  29. {
  30. char arr[20] = "BACDQFHG";//换为"BACDQFHG2483abxyefg"也是可以的
  31. reverse_aA0(arr, strlen(arr));
  32. cout << arr << endl;
  33. return 0;
  34. }

关于sort()函数用法可以参考我的http://blog.csdn.net/u014082714/article/details/44778877

类似面试题http://blog.csdn.net/u014082714/article/details/44339993

时间: 2024-12-14 18:41:18

一道经典面试题,字符数组排序问题(字符包含a-z、A-Z、0-9.)的相关文章

内存的堆分配和栈分配 &amp; 字符数组,字符指针,Sizeof总结

堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻

字符数组、字符指针请不要再纠结

在C语言中字符数组.字符指针的一些特质感觉有点模糊,有些时候只知道要这样做却不知道为什么,过段时间就忘了,下次又得费时费力费钱的找答案,难受.OK,今天就好好琢磨琢磨~ 先来两个基本概念: 1.声明字符数组 int a[10]; 定义了一个长度为10的数组a.换句话说它定义了一个由10个对象组成的集合,这10个对象存储在相邻的内存区域中,名字分别为a[0].a[1]....如果pa的声明为 int *pa; 则说明它是一个指向整形对象的指针,那么赋值语句 pa = &a[0]; 则可以将指针pa

字符数组与字符指针的区别与联系

1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a string."; 此时,string是字符数组,它存放了一个字符串. 字符指针str与字符数组str

经典面试题 之 数组的循环右移

经典面试题 之 数组的循环右移 题目的大意是将一个长度为n的数组A内的元素循环右移m位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}. 这题最平凡的做法是开另一个大小一样的数组B,遍历一下,令B[(i + m) % n] = A[i],再将B的内容写回到A即可.这个方法的时间复杂度为O(N),空间复杂度也为O(N). 很明显,需要优化空间的使用.有一种很优美但不太好懂的方法,是先将A的元素倒置,即{1, 2, 3, 4, 5}变成{5

关于C中字符数组,字符指针以及C++中string类型的两两转换及排序

// practise.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string.h> #include <string> #include <algorithm> #include <iostream> using namespace std; int main() { /* 字符串转字符数组,使用strncpy_s(),比strncpy()安全*/ string str

字符数组与字符指针

用字符数组和字符串指针都可实现字符串的存储和运算,但是两者是有区别的. 1) 字符数组是一个数组,每个元素的值都可以改变.而字符串指针指向的是一个常量字符串,它被存放在程序的静态数据区,一旦定义就不能改变.这是最重要的区别. 关于静态存储区的概念请查看:C语言内存模型(内存组织方式) 下面的代码在运行期间将会出错: 复制纯文本新窗口 #include <stdio.h> int main(){ char str1[] = "C Language"; char *str2 =

转:字符数组与字符指针

转自:http://blog.csdn.net/qiumm/article/details/5657120 1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化.此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址. 这里要注意字符指针与字符数组之间的区别.例如,有说明语句: char string[ ]="This is a st

字符数组和字符指针的差别

字符数组是一个指针常量,而字符指针是一个指针变量.例如以下代码所看到的 char a[80]; a[80]="Hello";   //错误.仅仅能挨个元素进行赋值或者使用字符串函数strcpy(str1,str2) char *p; p="Hello";   //正确.由于是变量能够指定指向哪个字符串

string str将str转字符数组以及字符数组初始化

c和指针(<pointers on c>) 8.1.11 一个字符串,如"hello",一般为字符串常量,可以用它对字符指针赋值,或初始化,相当于把这个字符串常量的首地址赋给这个指针,如: char *p = "hello"; 或者 char *p; p="hello"; C++STL之string 字符串常量不能write能read 但是,当用"hello"给字符数组作初始化时,"hello"