【剑指offer{31-34}】整数中1出现的次数(从1到n整数中1出现的次数)、把数组排成最小的数、丑数、第一个只出现一次的字符

博客涵盖了《剑指offer》中的四个经典编程题目:1. 计算从1到n整数中1出现的次数;2. 将数组排列成最小的数;3. 找出第N个丑数;4. 寻找字符串中第一个只出现一次的字符。每道题目都附带了C++实现代码。
摘要由CSDN通过智能技术生成


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

题目描述

  • 求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

C++代码

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n==0)
        {
            return 0;
        }
        int count = 0;
        for(int i = 1;i<=n;i++)
        {
            count = count + NumOne(i);
        }
        return count;
    }
    int NumOne(int k)
    {
        int res = 0;
        while(k)
        {
            if(k%10==1)
            {
                res++;
            }
            k = k/10;
        }
        return res;
    }
};

把数组排成最小的数

题目描述

  • 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

C++代码

class Solution {
public:
    vector<vector<int>>res;
    string PrintMinNumber(vector<int> numbers) 
    {
        sort(numbers.begin(),numbers.end());
        do
        {
            res.push_back(numbers);
        }while(next_permutation(numbers.begin(),numbers.end()));
        vector<string>result;
        for(int i = 0;i<res.size();i++)
        {
            string s = "";
            for(int j = 0;j<res[i].size();j++)
            {
                s = s + to_string(res[i][j]);
            }
            result.push_back(s);
        }
        sort(result.begin(),result.end());
        return result[0];
    }
};

丑数

题目描述

  • 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

C++代码

class Solution {
public:
    int GetUglyNumber_Solution(int index) 
    {
        if(index<=0)
        {
            return 0;
        }
        int index0 = 0;
        int index1 = 0;
        int index2 = 0;
        int *ugly = (int*)malloc(sizeof(int)*index);
        ugly[0] = 1;
        int i = 1;
        while(i<index)
        {
            int new2 = ugly[index0]*2;
            int new3 = ugly[index1]*3;
            int new4 = ugly[index2]*5;
            int tempvalue = min(min(new2,new3),new4);
            if(new2==tempvalue)
            {
                index0++;
            }
            if(new3==tempvalue)
            {
                index1++;
            }
            if(new4==tempvalue)
            {
                index2++;
            }
            ugly[i] = tempvalue;
            i++;
        }
        return ugly[index-1];
    }
};

第一个只出现一次的字符

题目描述

  • 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)

C++代码

class Solution {
public:
    int FirstNotRepeatingChar(string str) 
    {
        unordered_map<char,int>mp;
        for(int i = 0;i<str.size();i++)
        {
            mp[str[i]]++;
        }
        for(int j = 0;j<str.size();j++)
        {
            if(mp[str[j]]==1)
            {
                return j;
            }
        }
        return -1;
    }
};

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值