首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

有道難題第一題非 OO 解法:極致優化 160ms 紀錄

     編輯:關於ASP.NET

測試平台:P8600 4G RAM。現有最高效解法(夜咖啡)穩定 195-200ms,eaglet 約 400ms,本解法穩定 170ms 左右。

核心優化策略

  1. 外圍補零:在原始字串陣列四周各加一圈 '0',邊界檢查邏輯大幅簡化。
  2. 一維字串展平:將二維陣列轉為單一字串,索引計算改為 cur = i * cols + j,提升快取局部性。
  3. 鄰域索引直接運算:八鄰域索引以 up = cur - cols、down = cur + cols 等算術運算取得,避免巢狀迴圈。
  4. 批次減去 ASCII '0':累加八鄰域字元碼後一次減去 384 (8 * '0'),而非逐字元減去。

完整代碼

static public int countSpecialNumbers(string[] field, int A, int B) {
  int count = 0;
  int cols = field[0].Length + 2;
  int rows = field.Length + 2;
  string s = string.Concat(new string('0', cols + 1), String.Join("00", field), new string('0', cols + 1));
  int number, up, down, cur;
  for (int i = 1; i < rows - 1; i++) {
    for (int j = 1; j < cols - 1; j++) {
      cur = i * cols + j;
      up = cur - cols;
      down = cur + cols;
      number = s[up - 1] + s[up] + s[up + 1] + s[cur - 1] + s[cur + 1] + s[down - 1] + s[down] + s[down + 1] - 384;
      if (number >= A && number <= B) count++;
    }
  }
  return count;
}

將二維問題轉為一維陣列運算,結合補零邊界與批次 ASCII 減法,達到極致效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved