涉及陣列奇數字 偶數字的問題 資料終極狀態問題

2021-10-16 17:09:31 字數 1477 閱讀 2447

有一類問題很巧,這類問題涉及到在原陣列的奇數字、偶數字之間來回移動資料,類似題目有力扣893. groups of special-equivalent strings與力扣1217. minimum cost to move chips to the same position

巧在什麼地方呢,先看1217題,這道題說的是,每個位置上都有一些物品,而每個物品移動乙個位置,代價是1,移動兩個位置,代價是0。也就是說,i位置上的物品,移動到i+2或者i-2位置上時,是不需要任何代價的,當然前提是,陣列不越界。也就是說奇數字置i上的物品移動到任意乙個奇數字置j上,是不需要代價。任意乙個偶數字置q上的物品移動到任意乙個偶數字置p上,也是不需要花費任何代價。

不用真的去模擬移動的過程。可以直接遍歷陣列,得到奇數字置上的物品數量oddcnt,以及偶數字置上的物品數evencnt。因為肯定可以通過一系列移動,將oddcnt數量的物品與evencnt數量的物品,不花費任何代價就能靠在一起,再選擇兩者之間嬌小的乙個,將減少的那部分物品移動到有較多物品的那一摞。花費的代價最小是min(evevcnt,oddcnt)。

可以看到,並不用真正的模擬資料,直接就可以得到答案。

再看893題。這個題更有意思。

題目說,對於乙個string 類陣列 arr中的任意乙個元素比如說arr[0],可以將其奇數字置、偶數字置上的元素移動若干次,如果,與arr中任意別的元素相同,則,這兩個string是一組,請問該arr陣列一共有幾組。自己可以和自己是一組。

這涉及到在乙個陣列元素中移動奇數字置、偶數字置上的元素。這類問題可以自成一類。本題可以直接將乙個string元素,即arr[i]的奇數字置上和偶數字置上的字元摘出來,單獨形成字串,再使用sort排序,這樣,如果,有兩個string是這樣的一組字串,則,相同操作之後,這兩個串的形成的奇數字置、偶數字置上的元素的排序子串是相同的。

總之,一旦涉及到陣列奇數字置、偶數字置上的問題,可以單獨討論奇數字置元素與偶數字置元素。

終極狀態

這類問題都有乙個相同點,即資料有乙個終極狀態,對於893題來說,終極狀態是所有奇數字置的物品在同乙個位置上,所有偶數字置的物品在同乙個位置上。當然了不用真的去實現這個狀態,但是這就是終極狀態,移動到這種狀態是不需要花費任何代價的。

對於1217題來說,終極狀態就是,對於每乙個串,因為奇數字置可以互相交換任意次,偶數字置上的字元可以交換任意次,所以,終極狀態就是,將乙個串的奇數字置上的所有元素按照字典序排序、所有偶數字置上的字元元素按照字典序排序,若果有兩個串如此操作之後,完全相同,則這兩個串是符合題意的。

具體的操作,是將串str的奇數字置上的字元單獨提取出來為odd串,偶數字置上的字元單獨提取出來為even串,再使用sort()乙個排序即可,而不必非得在原串至上進行奇數字置、偶數字置單獨排序,這可能能夠做到,但是絕對沒有將奇數字置、偶數字置上的字元單獨提取出來在排序之後再拼接比較來的思路清楚、快。

2021/1/28補充例題

力扣1460. make two arrays equal by reversing sub-arrays

轉換陣列使奇數字為奇數 偶數字為偶數

設定 odd even兩個標誌位為odd為1,even為0,然後從最後一位開始看,如果說最後一位為偶數,就和even位交換,even自增2,如果是奇數,則和odd位交換,odd自增2,一直到二者其中乙個越界位置。解法比較奇特。include include include using namespa...

演算法題 奇數字放奇數偶數字放偶數

今天面試遇到這樣一道題,乙個長度為2n的整數陣列,裡邊有n個奇數n個偶數但是無序,要求奇數字放奇數偶數字放偶數 結題思路 採用雙指標分別記錄奇數字和偶數字,當偶數字的值錯誤的時候如果奇數錯誤的index不為空則交換數值,如果為空則將index記錄下來。奇數同理 public static void ...

奇數字上都是奇數或者偶數字上都是偶數

題目描述 給定乙個長度不小於2的陣列arr。寫乙個函式調整arr,使arr中要麼所有的偶數字上都是偶數,要麼所有的奇數字上都是奇數上。要求 如果陣列長度為n,時間複雜度請達到o n 額外空間複雜度請達到o 1 下標0,2,4,6.算作偶數字,下標1,3,5,7.算作奇數字,例如 1,2,3,4 調整...