一、字元串數組去重複
字元串數組去重複是指在一個字元串數組中,去掉重複的元素,使得數組中的元素唯一。字元串數組去重複是一個常見的問題,因為在實際的開發中,我們經常需要對一個字元串數組進行去重操作。下面我們就來看一下字元串數組去重的一些方法和原理。
二、字元串數組去重演算法
常見的字元串數組去重演算法有兩種,分別是:哈希表法和雙重循環法。
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