码迷,mamicode.com
首页 > 编程语言 > 详细

算法总结----数组弄巧

时间:2015-01-17 15:12:27      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

1. 排除数组中特定的字符,求剩下的字符的个数lens,同时保证原来数组前lens个元素中不包含被删除的字符(不要求顺序)。

例如

数组 [1, 3, 2, 3, 5]
删除元素 3
应该返回剩下的元素个数为3,并且保证数组前3个不包括元素3

思路

两个指针beg------指向当前访问的元素;end-----指向最后一个不为被删除的元素的位置

beg从头到end遍历,遍历期间保证end是指向不被删除的元素的位置,否则end主动往前靠拢,知道beg>end为止,返回end+1就是结果。

参考代码

#include <iostream>
using namespace std;
int getLen(int A[], int len, int aim)
{
    if (A == NULL || len <=0)
        return 0;
    int beg = 0, end = len-1;
    for (; beg <= end; ++beg)
    {
        while (end >= beg && A[end] == aim)
            --end;
        if (end < beg)
            break;
        if (A[beg] == aim) {
            A[beg] = A[end];
            --end;
        }
    }
    return end + 1;
}

int main()
{
    int a[] = {3, 3, 3, 3, 3};
    cout << "len_a:" << getLen(a, sizeof(a) / sizeof(int), 3) << endl;
    
    int b[] = {4, 2, 3, 2};
    int m = getLen(b, sizeof(b) / sizeof(int), 4);
    cout << "len_b:" << m << endl;
    for(int i = 0; i < m; ++i)
        cout << "::" << b[i] << endl;
}

运行结果

len_a:0
len_b:3
::2
::2
::3

 2.  求一个数组中后边的元素减去前边的元素的最大值

例如

数组 [3, 2, -1, 5, 4]
后减前最大值为:5 - (-1)=6

思路

定义局部最大值tmpMax(初始化为负无穷),局部最小值tmpLow(初始化为数组第一个元素)

从第二个元素开始遍历,如果(该元素-tmpLow )< 0说明该元素比tmpLow还小呢,那么就把tmpLow替换成该元素,同时比较该差值与tmpMax的大小,用大的替换tmpMax;否则(>=0)只需比较该差值与tmpMax的大小,用大的替换tmpMax。

参考代码

#include <iostream>
using namespace std;
int MAX_INT = ((unsigned)(-1)) >> 1;
int MIN_INT = -MAX_INT;

int getMaxGap(int A[], int lens)
{
    if (A == NULL || lens <= 0)
        return -1;
    int tmpMax = MIN_INT;
    int tmpLow = A[0];
    for (int i = 1; i < lens; ++i)
    {
        int tmp = A[i] - tmpLow;
        if (tmp > tmpMax)
            tmpMax = tmp;
        if (tmp < 0)
            tmpLow = tmp;
    }
    return tmpMax;
}


int main()
{
    int a[] = {3, 2, -1, 5, 4};
    cout << getMaxGap(a, sizeof(a) / sizeof(int)) << endl;
}

结果

6

3. 删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个。

思路:两个指针往后走

参考代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

void getNewStr(char a[])
{
    int new_cur = 0;
    int Isbeg = 1;
    int i = 0;
    for (i = 0; a[i] != \0; )
    {
        if (a[i] !=  )
        {
            Isbeg = 0;
            a[new_cur++] = a[i++];
        }
        else
        {
            if (Isbeg == 1)
            {
                while (a[i] != \0 && a[i] ==  )
                    ++i;
            }
            else
            {
                a[new_cur++] = a[i++];
                while (a[i] != \0 && a[i] ==  )
                    ++i;
            }
        }
    }
    cout << "new_cur:" << new_cur << endl;
    if (a[i-1] ==  )
        a[new_cur-1] = \0;
    else
        a[new_cur] = \0;
}
            
int main()
{
    char a[] = "  hello    hi      ";
    cout << a << endl;
    cout << sizeof(a) / sizeof(char) << endl;
    getNewStr(a);
    cout << a << endl;
    cout << sizeof(a) / sizeof(char) << endl;
    for (int i = 0; a[i] != \0; ++i)
        cout << a[i] << endl;
}

 

算法总结----数组弄巧

标签:

原文地址:http://www.cnblogs.com/kaituorensheng/p/3913786.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!