每日做题之剑指offer(六)

本文解析了《剑指offer》中多个算法题目,包括数组排成最小的数、丑数、第一个只出现一次的字符、数组中的逆序对、两个链表的第一个公共结点以及数组在排序数组中出现的次数。解题思路涉及字符串比较、哈希表统计、链表遍历等技术。
摘要由CSDN通过智能技术生成

1.把数组排成最小的数

时间限制:1秒 空间限制:32768K 热度指数:150958

本题知识点: 数组

题目描述

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

解题思路:

  • 我们应该找到一种排序规则,数组根据这个排序规则可以排成一个最小的数字
  • 要确定一个规则,就要比较两个数字,哪个应该排在前面,不是比较两个数值大小哦
  • 如果mn<nm,那么我们应该选择mn,定义此时的m<n
  • 如果mn>nm,那么我们应该选择nm,定义为此时的n<m
  • 如果mn=nm,选择哪个都可以,定义为此时的m=n
  • 然后就是拼接数字,直接计算mn和nm的大小便可,但是两个Int拼接起来的数字有可能超出Int所能表示的范围
  • 一个直观的解决大数的问题办法就是将数字转换成字符串,那么就变成了比较字符串的大小了
class Solution {
public:
    static bool cmp(string a, string b)
        {
        return a+b<b+a;
    }
    
    string PrintMinNumber(vector<int> numbers) {
         string result;
        if(numbers.size() == 0)
            return result;
        vector<string> tmp;
        for(int i = 0; i<numbers.size(); i++)
            {
            stringstream ss;
            ss<<numbers[i];
            tmp.push_back(ss.str());
        }
        sort(tmp.begin(),tmp.end(),cmp);
        for(int i =0; i<tmp.size(); i++)
            {
            result+=tmp[i];
        }
        return result;
    }
};

2.丑数

时间限制:1秒 空间限制:32768K 热度指数:169190

本题知识点: 数组

题目描述

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

解题思路:

  • 思路一,时间复杂度较高
  • 根据丑数的定义,丑数只能被2、3、5整除,也就是说,如果一个数能被2整除,就连续除以2;如果能被3整除就连续除以3;如果能被5整除就连续除以5
  • 如果最后除到的结果等于1,那么这个数就是丑数
  • 但是算法时间复杂度过高
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index < 0)
            return 0;
        
        int number = 0;
        int uglyFound = 0;
        
        while(uglyFound < index)
        {
            ++number; 
            
            if(IsUgly(number))
                ++uglyFound;
        }
        return number;
    }
    
    bool IsUgly(int number)
    {
        while(number % 2 == 0)
            number /= 2;
        
        while(number % 3 ==0)
            number /= 3;
        
        while(number % 5 == 0)
            number /= 5;
        
        return (number == 1) ? true : false;
    }
};
  • 思路二,以空间换时间
  • 我们可以找到一种只计算丑数的方法,就不用在非丑数上进行计算浪费时间
  • <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值