数据结构与算法---最大数、判断数组中所有的数字是否只出现一次

这篇博客探讨了两个算法问题:如何排列非负整数数组以得到最大数,以及如何判断数组中所有数字只出现一次。对于最大数问题,采用自定义比较器对数字字符串进行排序,通过字符串拼接实现高效比较。而对于唯一数字判断,提出了暴力法、排序法和哈希表法,其中哈希表法以O(n)的时间复杂度和O(1)的空间复杂度达到最优解。
摘要由CSDN通过智能技术生成

最大数

179. 最大数

给定一组非负整数 nums,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:
输入:nums = [10,2]
输出:“210”

示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”

示例 3:
输入:nums = [1]
输出:“1”

示例 4:
输入:nums = [10]
输出:“10”

提示:
1 <= nums.length <= 100
0 <= nums[i] <= 109


思路

  1. 首先判断边界值

  2. 将数组存储的整数转化为字符串

排序

如何排序?

一开始自己想的是,要拿到首位数,然后首位数与首位数做比较,大的在前面,如果两个首位数相等看次第二位,依次类推,比较麻烦,还得涉及到除余运算

看了答案,很是巧妙

由于数组元素被转化为了字符串
直接将两个字符串拼接起来,这样,两个字符串的长度就相同了,然后就可以比较两个字符串
例如:字符串a = “178”、字符串b = “1456”
字符串a后面拼接字符串b,a = “1781456”
字符串b后面拼接字符串a,b = “1456178”
这样长度相同了,明显a > b

排序完毕后拼接

class Solution {
    private class LargerNumberComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            String order1 = a + b;
            String order2 = b + a;
           return order2.compareTo(order1);
        }
    }

    public String largestNumber(int[] nums) {
        // Get input integers as strings.
        String[] asStrs = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            asStrs[i] = String.valueOf(nums[i]);
        }

        // Sort strings according to custom comparator.
        Arrays.sort(asStrs, new LargerNumberComparator());

        // If, after being sorted, the largest number is `0`, the entire number
        // is zero.
        if (asStrs[0].equals("0")) {
            return "0";
        }

        // Build largest number from sorted array.
        String largestNumberStr = new String();
        for (String numAsStr : asStrs) {
            largestNumberStr += numAsStr;
        }

        return largestNumberStr;
    }
}

判断数组中所有的数字是否只出现一次

判断数组中所有的数字是否只出现一次

给定一个个数字arr,判断数组arr中是否所有的数字都只出现过一次。

输入描述:
输入包括两行,第一行一个整数n,代表数组arr的长度。第二行包括n个整数,代表数组arr。

输出描述:
如果arr中所有数字都只出现一次,输出“YES”,否则输出“NO”。

示例1
输入
3
1 2 3
输出:YES

示例2
输入
3
1 2 1
输出:NO

备注:
要求
1.时间复杂度O(n)
2.额外空间复杂度O(1)


思路

牛客网没LeetCode好用呀
LeetCode上把需要用到的节点、主函数都给了。不需要自己手动建立节点
牛客网直接是一个空白面板,困难++了。。。

方法一:暴力法

两次for循环,看看有没有任意相等的
时间复杂度为O(n^2)

方法二:排序+一遍遍历

先排序,再左右看看有没有相等的,相当于是冒泡的一次
时间复杂度为:排序O(nlogn)+遍历O(n) = O(nlogn)

方法三:哈希表

使用哈希表,有一个算一个存储进去,再存储下一个的时候,看下里面有没有值,有的话返回false。没有的话存进去。当所有的数组元素都存进去后,返回true

哈希表方法请参考:
程序员代码面试指南刷题–第五章.判断数组中所有的数字是否只出现一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值