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

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;
}
时间: 2024-07-30 13:13:03

算法总结----数组弄巧的相关文章

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

1146: 零起点学算法53——数组中插入一个数

1146: 零起点学算法53--数组中插入一个数 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1749  Accepted: 613[Submit][Status][Web Board] Description 给定有序数组(从小到大),再给你一个数,要求插入该数到数组中并保持顺序 Input 多组测试,每组第一行输入一个整数n,然后是n个有序的整数 第二行输入1个整数m和1个整数K Outpu

算法题——数组内有序对的最大距离

题目:给定一个数组A,对于下标i < j,有A[i] < A[j],求j - i 的最大值. 思路:先正序遍历一次,利用一个辅助数组,记录每个元素的左边子数组中最小值的下标:然后倒序遍历,维持两个指针,初始都指向最后一个元素,通过移动两个指针,找出最大距离. 代码: 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int maxDist(int num[], int n) 6 {

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

1143: 零起点学算法50——数组中查找数

1143: 零起点学算法50--数组中查找数 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1910  Accepted: 777[Submit][Status][Web Board] Description 在给定的数组中查找一个数 Input 多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m Output 查找在第一行的n个整数中第一次出现数字m的下标位置并

1144: 零起点学算法51——数组中删数

1144: 零起点学算法51--数组中删数 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3304  Accepted: 933[Submit][Status][Web Board] Description 在给定的数组中删除一个数 Input 多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m Output 删除在第一行的n个整数中第一次出现数字m并删除,然后按

1145: 零起点学算法52——数组中删数II (有问题!)

1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 2935  Accepted: 793[Submit][Status][Web Board] Description 在给定的数组中删除数 Input 多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m Output 删除在第一行的n个整数中的数字m(多个的话都要删除),

Java数据结构与算法之数组

数组特点: 1.大小固定 2.同一数据类型 3.下标访问 4.数据项可重复 Java数据类型:基本类型(int和double)和对象类型.在许多编程语言中,数组也是基本类型.但在Java中把它们当作对象来对待,因此在创建数组时必须使用new操作符. 有序数组与无序数组比较:最主要的好处是查找速度比无序数组快多了.不好的方面是在插入操作中由于所有靠后的数据都需要移动以疼开空间,所以速度较慢.有序数组和无序数组数据中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的空洞. 数据访问:从

算法之--数组分割

题目来源:编程之美2.18 有一个无序的,元素个数为2n的正整数的数组,要求: 如何能把这个数组分割为元素个数为n的两个数组,使得两个子数组的和尽量接近. 解析:因为两个子数组的和是一定的,等于整个数组的和.现在要求使得两个字数组的和尽量的接近,也就意味着要从其中选出n个数使得这n个数的和尽可能的接近sum/2,不妨设为从小于sum/2的方向接近.于是,这就是一个01背包的问题: 现在有2N个物品,每个物品的重量为A[i],有一个背包的大小为sum/2,现在从中挑选出N个物品,使得背包尽可能的被