题目链接

Nowcoder

题目描述

给定一个长度为 8 的字符串 s,只包含大小写字母和数字。

你需要计算最少需要修改 s 中的多少个字符,才能使得 s 变成目标字符串 "Nowcoder"

解题思路

这是一个非常基础的字符串比较问题。这个需要计算的“最少修改次数”在信息论中被称为两个等长字符串之间的汉明距离(Hamming Distance)

核心思想

要用最少的操作次数将输入字符串 s 变为目标字符串 "Nowcoder",我们应该只对那些当前不匹配的字符进行修改。任何已经匹配的字符都不需要改动。

因此,问题的解法就是逐一比较两个字符串在相同位置上的字符,并统计不相同字符的个数。

算法步骤

  1. 定义目标字符串 target = "Nowcoder"
  2. 读取输入的字符串 s
  3. 初始化一个计数器 diff_count 为 0。
  4. 使用一个循环,从索引 i = 07,遍历两个字符串的每一个位置。
  5. 在循环的每一步,比较 s[i]target[i]
  6. 如果 s[i] != target[i],则将 diff_count 加 1。
  7. 循环结束后,diff_count 的值就是所求的最少修改次数。

代码

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string s;
    cin >> s;

    string target = "Nowcoder";
    int diff_count = 0;

    for (int i = 0; i < 8; ++i) {
        if (s[i] != target[i]) {
            diff_count++;
        }
    }

    cout << diff_count << endl;

    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();

        String target = "Nowcoder";
        int diffCount = 0;

        for (int i = 0; i < 8; i++) {
            if (s.charAt(i) != target.charAt(i)) {
                diffCount++;
            }
        }

        System.out.println(diffCount);
    }
}
import sys

def solve():
    try:
        s = sys.stdin.readline().strip()
        if not s:
            return
    except (IOError, ValueError):
        return

    target = "Nowcoder"
    diff_count = 0
    
    for i in range(8):
        if s[i] != target[i]:
            diff_count += 1
            
    print(diff_count)

solve()

算法及复杂度

  • 算法:字符串比较 / 线性扫描

  • 时间复杂度

    • 因为字符串的长度是固定的 8,所以我们总是执行固定次数的比较操作。
  • 空间复杂度

    • 我们只需要存储两个固定长度的字符串和一些计数变量,空间开销是常数级别的。