2026-01-27:出现频率最低的数字。用go语言,给定一个整数 n,统计其十进制表示中每个数字出现的次数,找出出现次数最少的

举报
福大大架构师每日一题 发表于 2026/01/27 06:43:51 2026/01/27
【摘要】 2026-01-27:出现频率最低的数字。用go语言,给定一个整数 n,统计其十进制表示中每个数字出现的次数,找出出现次数最少的那个数字;若有多位并列,则取数值最小的那一位。把该数字作为整数返回。1<=n<=231−11 <= n <= 2^{31} - 11<=n<=231−1。输入: n = 723344511。输出: 2。解释:在 n 中,出现频率最低的数字是 7、2 和 5,它们都只...

2026-01-27:出现频率最低的数字。用go语言,给定一个整数 n,统计其十进制表示中每个数字出现的次数,找出出现次数最少的那个数字;若有多位并列,则取数值最小的那一位。把该数字作为整数返回。

1<=n<=23111 <= n <= 2^{31} - 1

输入: n = 723344511。

输出: 2。

解释:

在 n 中,出现频率最低的数字是 7、2 和 5,它们都只出现了一次。

题目来自力扣3663。

📊 步骤一:统计数字出现次数

首先,程序需要统计整数 n 的十进制表示中每个数字(0-9)出现的次数。

  1. 初始化计数器:创建一个长度为10的整数数组 cnt,初始值全为0。数组的索引对应数字0到9,其值对应该数字出现的次数。
  2. 遍历每一位数字:通过一个循环来处理整数 n。只要 n 大于0,就重复以下操作:
    • 提取末位数字:通过取模运算 n % 10 得到 n 的个位数字。
    • 更新计数器:将计数器数组 cnt 中对应这个数字的计数值加1。
    • 移除已处理位:通过整数除法 n / 10 去掉 n 的个位数,为处理下一位做准备。
  3. 处理完成:当 n 变为0时,循环结束。此时,数组 cnt 中已经记录了0-9每个数字在原始整数中出现的次数。需要注意的是,如果某个数字没有出现过,它的计数将保持为0。

🔍 步骤二:查找出现次数最少的数字

在得到频率统计后,下一步是找出出现次数最少的数字。

  1. 初始化查找变量
    • minC:用于记录当前找到的最小出现次数。初始值被设置为一个非常大的数(math.MaxInt),以确保第一次遇到出现过的数字时,其次数肯定比 minC 小。
    • ans:用于记录当前找到的、满足条件(出现次数等于 minC)的数字。
  2. 遍历计数器数组:遍历数组 cnt 的每一个位置(即数字0到9)。
  3. 判断与更新:对于每个数字 i(即索引 i),如果它的计数值 c 大于0(表示该数字确实出现过),则进行以下判断:
    • 发现更小频率:如果 c 小于当前的最小频率 minC,说明找到了出现次数更少的数字。此时,更新 minC 为这个更小的值 c,同时将答案 ans 更新为当前数字 i
    • 处理并列情况:如果 c 等于当前的最小频率 minC,说明出现了并列情况。这时,根据题目要求“取数值最小的那一位”,程序会比较当前数字 i 和当前答案 ans 的大小。如果 i 小于 ans,则更新 ansi。你提供的代码中省略了这一步的逻辑,但根据题目描述,这是必要的一环。
  4. 返回结果:遍历完成后,变量 ans 中存储的就是出现次数最少且数值最小的数字,将其作为结果返回。

⏱️ 复杂度分析

  • 总的时间复杂度O(d),其中 d 是整数 n 的十进制位数。
    • 第一步统计次数需要循环 d 次(每次循环处理一位数字)。
    • 第二步查找最小频率数字需要循环固定的10次(因为数字只有0-9共10种可能)。
    • 因此,总时间与数字 n 的位数成正比。
  • 总的额外空间复杂度O(1),即常数空间。
    • 程序只使用了一个固定大小的数组 cnt(长度10)和几个整型变量。这些空间需求不随输入整数 n 的大小而增长。

Go完整代码如下:

package main

import (
	"fmt"
	"math"
)

func getLeastFrequentDigit(n int) (ans int) {
	// 统计每个数字的出现次数
	cnt := [10]int{}
	for n > 0 {
		cnt[n%10]++
		n /= 10
	}

	// 找出现次数最小的数字
	minC := math.MaxInt
	for i, c := range cnt {
		if c > 0 && c < minC {
			minC = c
			ans = i
		}
	}
	return
}

func main() {
	n := 723344511
	result := getLeastFrequentDigit(n)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

import sys

def get_least_frequent_digit(n: int) -> int:
    # 统计每个数字的出现次数
    cnt = [0] * 10
    while n > 0:
        cnt[n % 10] += 1
        n //= 10
    
    # 找出现次数最小的数字
    min_c = sys.maxsize
    ans = 0
    for i, c in enumerate(cnt):
        if c > 0 and c < min_c:
            min_c = c
            ans = i
    return ans

if __name__ == "__main__":
    n = 723344511
    result = get_least_frequent_digit(n)
    print(result)

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <climits>

int getLeastFrequentDigit(int n) {
    // 统计每个数字的出现次数
    int cnt[10] = {0};
    while (n > 0) {
        cnt[n % 10]++;
        n /= 10;
    }

    // 找出现次数最小的数字
    int minC = INT_MAX;
    int ans = 0;
    for (int i = 0; i < 10; i++) {
        if (cnt[i] > 0 && cnt[i] < minC) {
            minC = cnt[i];
            ans = i;
        }
    }
    return ans;
}

int main() {
    int n = 723344511;
    int result = getLeastFrequentDigit(n);
    std::cout << result << std::endl;
    return 0;
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。