Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1002121
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-10-09 23:06:28

88题目:函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)
54题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
54扩展:要求移动之后,奇数部分和偶数部分每个数的相对位置不变。比如1,2,3,4移动完之后必须是1,3,2,4

这3个题目有类似,所以放在一起。
88.
a.用一个指针p逆序读取串,读到*时,记录位置w (例子中是倒数第三个字符)
b.然后继续往前读,读到最近的一个字符,记录位置c(例子中是最后一个e)
c.交换w,c的内容。
d.这时,显然w以及w之后的部分已经完成了,指针移到w-1处,跳转到a步骤。

54.
这个题目没有什么难度,类似快排,从头开始读,读到一个偶数的时候记录,从尾开始读,读到奇数记录,然后交换两个内容,继续向中间读,直到结束。

54扩展
这个比54难了一些,虽然不是很复杂,但是还是需要思考一下的。
采用了类似冒泡的算法。
a.取一个指针odd,指向数组头部,同时头部记录为head。odd往后读,如果是奇数,停下。
b.这时,需要把这个奇数单步往前挪,挪到head位置。
c.完成后,head处的值就是奇数了,也就是head和head之前的部分,完成了排序。
d.odd指向head后一位,同时,把head也后移一位。跳转到a步骤。
f.当a步骤读不到奇数时,循环结束。

三个题目代码如下

54题代码

点击(此处)折叠或打开

  1. #include <stdlib.h>

  2. #include <stdio.h>

  3. /*
  4.  * === FUNCTION ======================================================================
  5.  * Name: main
  6.  * Description:
  7.  * =====================================================================================
  8.  */
  9.     int
  10. main ( int argc, char *argv[] )
  11. {
  12.     int input[] = {1,2,3,4,6,9,10};
  13.     int *head = input;
  14.     int *tail = input + sizeof(input)/sizeof(int);
  15.     while(1){
  16.         while(*head % 2 == 1) head++;
  17.         while(*tail % 2 == 0) tail--;
  18.         if(head>tail) break;
  19.         *head ^= *tail;
  20.         *tail ^= *head;
  21.         *head ^= *tail;
  22.     }
  23.     int i = 0;
  24.     for(;i<sizeof(input)/sizeof(int);i++){
  25.         printf ( "%d ", input[i] );
  26.     }

  27.     return EXIT_SUCCESS;
  28. }                /* ---------- end of function main ---------- */
88和54扩展代码

点击(此处)折叠或打开

  1. /*
  2.  * =====================================================================================
  3.  *
  4.  * Filename: movewildchar.c
  5.  *
  6.  * Description:
  7.  *
  8.  * Version: 1.0
  9.  * Created: 10/09/2012 05:21:06 PM
  10.  * Revision: none
  11.  * Compiler: gcc
  12.  *
  13.  * Author: YOUR NAME (),
  14.  * Organization:
  15.  *
  16.  * =====================================================================================
  17.  */
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <unistd.h>

  22. int movewildchar(char* input){
  23.     char* wild, *letter, *ptr;
  24.     ptr = input + strlen(input)-1;
  25.     int count = 0;
  26.     do{
  27.         while(*ptr != '*' &&ptr!=input){
  28.             ptr--;
  29.         }
  30.         wild = ptr;
  31.         while(*ptr =='*'&&ptr!=input){
  32.             ptr--;
  33.         }
  34.         letter = ptr;
  35.         if(*wild != *input){
  36.             *wild ^= *letter;
  37.             *letter ^= *wild;
  38.             *wild ^= *letter;
  39.             count++;
  40.             ptr = wild;
  41.         }
  42.     }while( * '*');
  43.     return count;
  44. }

  45. void sortoddorder(int *nums, int size){
  46.     int *odd = nums;
  47.     int *head = nums;
  48.     while(1){
  49.         while((*odd & 1) == 0 && odd<nums+size){
  50.             odd++;
  51.         }
  52.         if(odd-nums+1 > size) return;
  53.         printf ( "now tracking %d\n", *odd );
  54.         while( head){
  55.             int *t = odd-1;
  56.             *odd^=*t;
  57.             *t^=*odd;
  58.             *odd^=*t;
  59.             odd--;
  60.         }
  61.         odd++;
  62.         head = odd;
  63.     }
  64. }

  65. /*
  66.  * === FUNCTION ======================================================================
  67.  * Name: main
  68.  * Description:
  69.  * =====================================================================================
  70.  (n)
  71.  */
  72.     int
  73. main ( int argc, char *argv[] )
  74. {
  75.     char input[] = {"ab**cd**12"};
  76.     int count = movewildchar(input);
  77.     printf ( "count = %d %s\n", count, input );
  78.     int nums[] = {1,2,3,4,5,5,5};
  79.     sortodd(nums, sizeof(nums)/4);
  80.     int i = 0;
  81.     for(;i<sizeof(nums)/4;i++){
  82.         printf ( "%d \n", nums[i] );
  83.     }
  84.     return EXIT_SUCCESS;
  85. } /* ---------- end of function main ---------- */

阅读(922) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~