字元串數組去重的多方面闡述

一、字元串數組去重複

字元串數組去重複是指在一個字元串數組中,去掉重複的元素,使得數組中的元素唯一。字元串數組去重複是一個常見的問題,因為在實際的開發中,我們經常需要對一個字元串數組進行去重操作。下面我們就來看一下字元串數組去重的一些方法和原理。

二、字元串數組去重演算法

常見的字元串數組去重演算法有兩種,分別是:哈希表法和雙重循環法。

1、哈希表法


std::unordered_set unique_set;

for (auto str: str_array)
{
    unique_set.insert(str);
}

std::vector unique_str_array(unique_set.begin(), unique_set.end());

哈希表法的實現原理是創建一個哈希表,將字元串數組中的每個元素都插入到哈希表中。由於哈希表中不能存在相同的元素,所以最終得到的哈希表中就是去重後的字元串數組。在C++中,可以使用std::unordered_set實現哈希表。

2、雙重循環法


for (int i = 0; i < str_array.size(); ++i)
{
    bool flag = false;
    for (int j = 0; j < i; ++j)
    {
        if (str_array[i] == str_array[j])
        {
            flag = true;
            break;
        }
    }
    if (flag == false)
    {
        unique_str_array.push_back(str_array[i]);
    }
}

雙重循環法的實現原理是,使用兩個循環遍歷整個字元串數組,對於每個元素,判斷它前面是否已經出現過。如果已經出現過,則標記為重複元素,否則添加到新的數組中。該方法的時間複雜度為O(N^2)。

三、字元串數組去重c語言代碼

在C語言中,可以使用hash表實現字元串數組去重。


// 哈希表大小
#define HAVEHT_SIZE 100

// 哈希表結構體
typedef struct _haveht
{
    char* val;  // 值
    struct _haveht* next;   // 鏈表指針
} haveht;

// 哈希表
haveht* hashTable[HASH_SIZE];

void cleanHashTable()
{
    memset(hashTable, 0, sizeof(hashTable));
}

int hash(const char* str)
{
    int hash = 0;
    int len = strlen(str);

    for (int i = 0; i val, str) == 0)
        {
            return;
        }
        node = node->next;
    }

    haveht* new_node = (haveht*)malloc(sizeof(haveht));
    new_node->val = str;
    new_node->next = hashTable[key];
    hashTable[key] = new_node;
}

//去重函數
int unique(char* a[], int n)
{
    cleanHashTable();

    int cnt = 0;
    for (int i = 0; i val, a[i]) == 0)
            {
                a[i][0] = 0;
                break;
            }
            node = node->next;
        }

        if (strlen(a[i]) != 0)
        {
            addHashtable(a[i]);
            cnt++;
        }
    }

    return cnt;
}

四、前端字元串數組去重

在前端的開發中,我們同樣需要對字元串數組進行去重。下面我們就來介紹幾種前端去重的方式。

1、ES6 Set去重法


const arr = ['aaa', 'bbb', 'ccc', 'aaa', 'bbb'];

function unique(arr) {
  return [...new Set(arr)];
}

const uniqueArr = unique(arr); // ['aaa', 'bbb', 'ccc']

ES6中提供了Set數據結構,Set可以自動去重。結合ES6的解構語法,就可以使用一行代碼實現字元串數組的去重操作。

2、reduce去重法


const arr = ['aaa', 'bbb', 'ccc', 'aaa', 'bbb'];

function unique(arr) {
  return arr.reduce((res, cur) => {
    return res.includes(cur) ? res : [...res, cur];
  }, []);
}

const uniqueArr = unique(arr); // ['aaa', 'bbb', 'ccc']

reduce函數是JS中非常常用的函數,通常用於將一個數組中的元素按照某種方式進行聚合。在去重時,我們可以通過reduce函數來依次遍曆數組中的每個元素,將不同的元素保存到res數組中,從而實現去重操作。這種方法的時間複雜度為O(N)。

3、filter去重法


const arr = ['aaa', 'bbb', 'ccc', 'aaa', 'bbb'];

function unique(arr) {
  return arr.filter((el, index, arr) => {
    return arr.indexOf(el) === index;
  });
}

const uniqueArr = unique(arr); // ['aaa', 'bbb', 'ccc']

filter函數通常用於過濾數組中的元素,從而得到一個新的符合條件的數組。在去重時,我們可以通過filter函數來過濾掉重複的元素,從而得到一個新的數組。這種方法的時間複雜度為O(N^2)。

五、定義字元串數組

定義字元串數組,需要使用類型為char*的指針數組即可。例如,可以使用以下方式來定義一個長度為3的字元串數組:


char* str_array[3] = {"aaa", "bbb", "ccc"};

六、字元串和數組的區別

字元串和數組都是C/C++/JS中經常使用的數據結構,它們都有相似的定義和使用方式,但是它們之間存在一些區別。

1、內存存儲方式不同

數組的元素是連續存儲的,而字元串的元素是在內存中分散存儲的。數組的元素存儲在一個數據塊中,通過索引可以直接訪問到元素。而字元串的元素存儲在不同的內存塊中,需要使用指針來訪問。

2、定義方式不同

在定義一個數組時,需要指定數組的大小,在定義字元串時,可以根據字元串的長度自動分配內存空間。

3、字元串具有特殊的終止符

字元串在內存中有一個特殊的終止符,即’\0’,用來標識字元串的結尾,而數組沒有這個終止符。

七、字元串數組重排

字元串數組重排指的是將一個字元串數組按照指定的順序重新排列。下面我們介紹兩種常見的字元串數組重排方式。

1、快速排序法


void quickSort(char **str_array, int left, int right) 
{
    if (left >= right) {
        return;
    }

    char* pivot = *(str_array + left);
    int i = left + 1, j = right;

    while (true) 
    {
        while (i <= j && strcmp(*(str_array + i), pivot) < 0) 
        {
            i++;
        }

        while (i = 0) 
        {
            j--;
        }

        if (i > j) 
        {
            break;
        }

        char* temp = *(str_array + i);
        *(str_array + i) = *(str_array + j);
        *(str_array + j) = temp;
    }

    *(str_array + left) = *(str_array + j);
    *(str_array + j) = pivot;

    quickSort(str_array, left, j - 1);
    quickSort(str_array, j + 1, right);
}

快速排序法是一種高效的排序演算法,時間複雜度為O(NlogN)。在對字元串數組重排時,我們可以使用快速排序法將數組中的元素按照一定的順序進行排序。例如,下面的代碼可以對字元串數組按照字典序進行排序:


char* str_array[5] = {"hello", "world", "apple", "banana", "cat"};

quickSort(str_array, 0, 4);

for (int i = 0; i < 5; ++i)
{
    printf("%s ", *(str_array + i));
}

2、STL中的sort函數


#include 

bool compareFunc (const char* a, const char* b) 
{ 
    return strcmp(a,b) < 0; 
}

int main() 
{
    char* str_array[5] = {"hello", "world", "apple", "banana", "cat"};

    std::sort(str_array, str_array + 5, compareFunc);

    for(int i = 0; i < 5; ++i) 
    {
        printf("%s ", *(str_array + i));
    }

    return 0;
}

在C++ STL中,提供了sort函數,可以通過指定比較函數來對數組進行排序。比較函數需要返回一個bool類型的值,表示兩個元素的比較結果。下面的代碼可以對字元串數組按照字典序進行排序:

八、字元串去重的方法

下面我們總結一下字元串去重的五種方法。

1、哈希表法

哈希表法的實現原理是創建一個哈希表,將字元串數組中的每個元素都插入到哈希表中。由於哈希表中不能存在相同的元素,所以最終得到的哈希表中就是去重後的字元串數組。實現語言包括C++,Python等。

2、雙重循環法

雙重循環法的實現原理是,使用兩個循環遍歷整個字元串數組,對於每個元素,判斷它前面是否已經出現過。如果已經出現過,則標記為重複元素,否則添加到新的數組中。該方法的時間複雜度為O(N^2)。實現語言包括C++,Java等。

3、ES6 Set去重法

ES6中提供了Set數據結構,Set可以自動去重。結合ES6的解構語法,就可以使用一行代碼實現字元串數組的去重操作。實現語言為JS。

4、reduce去重法

reduce函數是JS中非常常用的函數,通常用於將一個數組中的元素按照某種方式進行聚合。在去重時,我們可以通過reduce函數來依次遍曆數組中的每個元素,將不同的元素保存到res數組中,從而實現去重操作。該方法的時間複雜度為O(N)。實現語言為JS。

5、filter去重法

filter函數通常用於過濾數組中的元素,從而得

原創文章,作者:JQUF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147420.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JQUF的頭像JQUF
上一篇 2024-11-01 14:09
下一篇 2024-11-01 14:09

相關推薦

  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python中將字元串轉化為浮點數

    本文將介紹在Python中將字元串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字元串轉化為…

    編程 2025-04-29
  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29
  • Python去掉數組的中括弧

    在Python中,被中括弧包裹的數據結構是列表,列表是Python中非常常見的數據類型之一。但是,有些時候我們需要將列表展開成一維的數組,並且去掉中括弧。本文將為大家詳細介紹如何用…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python如何將字元串1234變成數字1234

    Python作為一種廣泛使用的編程語言,對於數字和字元串的處理提供了很多便捷的方式。如何將字元串「1234」轉化成數字「1234」呢?下面將從多個方面詳細闡述Python如何將字元…

    編程 2025-04-29
  • Python二維數組對齊輸出

    本文將從多個方面詳細闡述Python二維數組對齊輸出的方法與技巧。 一、格式化輸出 Python中提供了格式化輸出的方法,可以對輸出的字元串進行格式化處理。 names = [‘A…

    編程 2025-04-29

發表回復

登錄後才能評論