计算1到n的数中1出现的次数

#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>
using namespace std;


class Solution {
public:
	int NumberOf1Between1AndN_Solution(int n)
	{
		string data;
		char str[256];
		sprintf(str, "%d", n);
		data = str;
		return NumberOf1(data);
	}
	int NumberOf1(const string &data)
	{
		if (data.size() == 0 || data.front() < '0' || data.back() > '9' || data.front() == '\n')
		{
			return 0;
		}
		if (data.size() == 1 && (data.front() - '0') == 0)//'0'
		{
			return 0;
		}
		if (data.size() == 1 && (data.front() - '0') > 0)//'1','2',...,'9'
		{
			return 1;
		}
		int numfirstDigit = 0;
		if (data.front() == '1')//两位数以上,最高位为1
		{
			numfirstDigit = atoi(data.c_str() + 1) + 1;
		}
		else
		{
			if (data.front() > '1')//两位数以上,最高位是2,3,...,9
			{
				numfirstDigit = PowerBase10(data.size() - 1);
			}
		}
		int numotherDigit = (data.front() - '0') * (data.size() - 1) * PowerBase10(data.size() - 2);//去掉最高位,后面的按全排列完成
		int numRecursive = NumberOf1(string(data.c_str() + 1)); //次高位变成最高位从新计算
		return numfirstDigit + numotherDigit + numRecursive;
	}


	int PowerBase10(unsigned int n)
	{
		int result = 1;
		for (unsigned int i = 0; i < n; i++)
		{
			result *= 10;
		}
		return result;
	}
};


int main(void) {
	int value;
	Solution s;
	while (scanf("%d", &value) != EOF)
	{
		printf("%d\n", s.NumberOf1Between1AndN_Solution(value));
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\],可以使用数对对消的思路来解决这个问题。假设数组出现次数最多的数为1,并且超过了一半。我们可以将1与其他不为1的数字进行匹配,每次匹配出一个<1,?>的数对。最后剩余没有匹配的数仍然是1,即为出现次数最多的数。这种方法的时间复杂度较高,需要遍历整个数组。具体的代码可以根据实际情况进行编写。 另外,根据引用\[2\]和引用\[3\],还可以使用计数数组或HashMap来解决这个问题。使用计数数组的方法是定义一个计数数组count,用来对数组的数字出现次数进行计数。count数组最大的元素对应的下标即为出现次数最多的那个数。使用HashMap的方法是遍历数组元素构造HashMap,然后遍历每个Entry,找出最大value对应的key,即为出现次数最多的那个数。这两种方法的时间复杂度都为O(n)。 综上所述,可以根据实际情况选择使用数对对消、计数数组或HashMap来求解数组出现次数前n个出现次数最多的数。 #### 引用[.reference_title] - *1* *2* *3* [找出数组出现次数最多的那个数——主元素问题](https://blog.csdn.net/weixin_39599830/article/details/114518563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值