j538 - 賣場設置 (Market)
題目描述
題目給定一個字串 s 和一個字串 n,其中 s 代表賣場的商品名稱,n 代表對應商品的數量。s 中可能包含大小寫字母,代表同一個商品的兩種寫法。要求根據 s 中相同商品的總數量,更新 n 中對應位置的數字,並輸出更新後的 n。
解題思路
這題的核心思想是統計每個商品(不區分大小寫)的總數量,然後將數量分配到 n 字串中對應商品的位置。
- 統計商品數量: 使用一個大小為 26 的陣列
v儲存每個字母(不區分大小寫)對應的總數量。使用一個大小為 26 的 vector 陣列e儲存每個字母在s中出現的位置索引。 - 遍歷
s: 遍歷字串s,對於每個字符,判斷其是否為字母。如果是字母,則將其轉換為小寫字母的索引,並將對應的n字串的數字轉換為整數後加到v陣列中,同時將索引存入e陣列。 - 分配數量: 遍歷
v陣列,對於每個字母,計算v陣列中該字母的總數量除以e陣列中該字母出現次數的餘數mod。 - 更新
n: 從e陣列中該字母出現位置的最後一個開始,依次將n字串中對應位置的數字更新為v陣列中該字母的總數量除以e陣列中該字母出現次數的商加 1,如果mod不為 0,則將n字串中對應位置的數字更新為v陣列中該字母的總數量除以e陣列中該字母出現次數的商。
複雜度分析
- 時間複雜度: O(N),其中 N 是字串
s的長度。遍歷字串s需要 O(N) 的時間,遍歷v陣列需要 O(26) 的時間,整體時間複雜度為 O(N)。 - 空間複雜度: O(26),主要用於儲存
v和e陣列,空間複雜度為 O(1)。
程式碼
#include <iostream>
#include <vector>
using namespace std;
int v[26],mod[26];
string s,n;
vector <int> e[26];
int main(){
cin >> s >> n;
for(int i=0;i<s.size();++i){
if(s[i]>='a'){
e[s[i]-'a'].push_back(i);
v[s[i]-'a']+=n[i]-'0';
}
else{
e[s[i]-'A'].push_back(i);
v[s[i]-'A']+=n[i]-'0';
}
}
for(int i=0;i<26;++i){
int es=e[i].size();
if(es==0)continue;
mod[i]=v[i]%es;//7%4 = 3 = 1 2 2 2
for(int j=es-1;j>=0;--j){
if(mod[i]){
n[e[i][j]]=v[i]/es+1+'0';
--mod[i];
}
else{
n[e[i][j]]=v[i]/es+'0';
}
}
}
cout << n;
}