最大数
给定一组非负整数 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
思路
-
首先判断边界值
-
将数组存储的整数转化为字符串
排序
如何排序?
一开始自己想的是,要拿到首位数,然后首位数与首位数做比较,大的在前面,如果两个首位数相等看次第二位,依次类推,比较麻烦,还得涉及到除余运算
看了答案,很是巧妙
由于数组元素被转化为了字符串
直接将两个字符串拼接起来,这样,两个字符串的长度就相同了,然后就可以比较两个字符串
例如:字符串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
哈希表方法请参考:
程序员代码面试指南刷题–第五章.判断数组中所有的数字是否只出现一次