İçeriğe atla
ΣDSA Patterns
Menü
Dil

Fark Dizisi

Rehber 6 / 6 · Yol 6 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
a
b
c

s = abc

Harfleri kaydır: dir 0 −1, dir 1 +1, dahil aralıklarda.

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Shifting Letters II

Problem (yeniden ifade)

Küçük harflerden string s. shifts[i]=[start,end,dir] kapsayıcı aralığı ileri (dir=1) veya geri (dir=0) 1 kaydırır. Son string’i döndür.

Sezgi

Difference array ile indekse net kaydırma; her karaktere mod 26 uygula.

Yaklaşımlar

Kaydırma deltalarının difference array'i

Doğrulanmadı
Zaman O(n + q)Alan O(n)

Fikir. Aralıklar üzerinde +1 veya -1; önek toplam, toplam kaydırmadır; (c-‘a’+shift) mod 26.

Yürüyüş. “abc”, [[0,1,0],[1,2,1],[0,2,1]] → “ace”.

Trade-off. Naif sorgu-başı güncelleme O(nq); diff O(n+q)’ya çöker.

Çözüm
export function shiftingLetters(s: string, shifts: number[][]): string {
  const n = s.length;
  const diff = Array(n + 1).fill(0);
  for (const sh of shifts) {
    const d = sh[2] === 1 ? 1 : -1;
    diff[sh[0]!] += d;
    diff[sh[1]! + 1] -= d;
  }
  const chars = s.split("");
  let cur = 0;
  for (let i = 0; i < n; i++) {
    cur += diff[i]!;
    let k = (chars[i]!.charCodeAt(0) - 97 + cur) % 26;
    if (k < 0) k += 26;
    chars[i] = String.fromCharCode(97 + k);
  }
  return chars.join("");
}
export function shiftingLetters(s: string, shifts: number[][]): string {
  const n = s.length;
  const diff = Array(n + 1).fill(0);
  for (const sh of shifts) {
    const d = sh[2] === 1 ? 1 : -1;
    diff[sh[0]!] += d;
    diff[sh[1]! + 1] -= d;
  }
  const chars = s.split("");
  let cur = 0;
  for (let i = 0; i < n; i++) {
    cur += diff[i]!;
    let k = (chars[i]!.charCodeAt(0) - 97 + cur) % 26;
    if (k < 0) k += 26;
    chars[i] = String.fromCharCode(97 + k);
  }
  return chars.join("");
}

Şablon bağlantısı

String üzerinde difference array aralık güncellemeleri.

Yansıma