剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)&把数组排成最小的数&丑数

#31.整数中1出现的次数(从1到n整数中1出现的次数)

/************************************************************************/
/* 题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。
ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)                                                                     */
/************************************************************************/
/*
#include <iostream>
using namespace std;
int NumberOf1Between1AndN_Solution(int n)
{
	if (n < 1)
		return 0;
	if (n == 1)
		return 1;
	int base = 1, remain = 0, current = 0, num = 0;
	while (n)
	{
		current = n % 10;
		n /= 10;
		if (current > 1)
		{
			num += (n + 1)*base;
		}
		else if (current == 1)
		{
			num += (n*base) + remain + 1;
		}
		else
		{
			num += n * base;
		}
		remain += current * base;
		base *= 10;
	}
	return num;
}
int main()
{
	int n = 13;
	cout << NumberOf1Between1AndN_Solution(n) << endl;
	system("pause");
	return 0;
}
*/

#32.把数组排成最小的数

/*
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
*/
#include <iostream>
#include <vector>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
static bool compare(string str1, string str2)
{
	string s1 = str1 + str2;
	string s2 = str2 + str1;
	return s1 < s2;
}
string PrintMinNumber(vector<int> numbers)
{
	string str;
	if (numbers.empty())
		return str;
	vector<string> vec;
	for (int i = 0; i < numbers.size(); i++)
	{
		stringstream ss;
		ss << numbers[i];
		vec.push_back(ss.str());
	}
	sort(vec.begin(), vec.end(), compare);
	for (int i = 0; i < vec.size(); i++)
	{
		str.append(vec[i]);
	}
	return str;
}
int main()
{
	vector<int> vec;
	vec.push_back(3);
	vec.push_back(32);
	vec.push_back(321);
	string str = PrintMinNumber(vec);
	cout << str << endl;
	system("pause");
	return 0;
}

#33.丑数

/*
题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
*/
int GetUglyNumber_Solution(int index) {
        switch (index)
        {
            case 1:return 1;
            case 2:return 2;
            case 3:return 3;
            case 4:return 4;
            case 5:return 5;
        }
        vector<int> vec;
        vec.push_back(1);
        vec.push_back(2);
        vec.push_back(3);
        vec.push_back(4);
        vec.push_back(5);
        for (int i = 5; i <= index; i++)
        {
            int temp = 0,min2 = 0, min5=0,min3=0;
            for (int j = 0; j < i; j++)
            {
                temp = vec[j] * 2;
                if (temp > vec[i - 1])
                {
                    min2 = temp;
                    break;
                }
            }
            for (int j = 0; j < i; j++)
            {
                temp = vec[j] * 5;
                if (temp > vec[i - 1])
                {
                    min5 = temp;
                    break;
                }
            }
            for (int j = 0; j < i; j++)
            {
                temp = vec[j] * 3;
                if (temp > vec[i-1])
                {
                    min3 = temp;
                    break;
                }
            }
            int min = min2 < min3 ? min2 : min3;
            min = min < min5 ? min : min5;
            vec.push_back(min);
        }
        return vec[index-1];
    }

猜你喜欢

转载自blog.csdn.net/foreverdongjian/article/details/82356982