2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
提交链接:
https://codefun2000.com/p/P1137
为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"
题目内容
塔子哥是一个非常有个性的人,他对待装饰品摆放方式的审美角度很奇特。他认为高度相差比较大的装饰品放在相邻位置会很难看。最近,他正在整理桌子上的一排装饰品,但是发现它们的位置摆放得不太好看。于是,他想对这排装饰品进行整理,可以交换任意两个装饰品的位置任意多次,以便让它们看起来更加美观。
假设当前从左到右 n n n 个装饰品的高度分别为 h 1 , h 2 , … , h n h_1,h_2,…,h_n h1,h2,…,hn 那么当前这一排装饰品的丑陋值为 ∑ i = 1 n − 1 ∣ h i − h i + 1 ∣ \sum^{n-1}_{i=1} |h_i-h_{i+1}| ∑i=1n−1∣hi−hi+1∣ ,其中 ∣ x ∣ |x| ∣x∣ 为 x x x 的绝对值。塔子哥不想他的装饰品看起来很丑陋,他想最小化他的装饰品的丑陋值,请你帮他排一下顺序。
形式化地来讲,有一长为 n n n 的序列 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an ,你可以任意次数地进行交换,每次交换都可以选择任意两个不同的数 i , j i,j i,j ,交换 a i , a j a_i,a_j ai,aj 的位置。
假设经过若干次交换后,序列变为 h 1 , h 2 , . . . , h n h_1,h_2,...,h_n h1,h2,...,hn 其丑陋值为 ∑ i = 1 n − 1 ∣ h i − h i + 1 ∣ \sum^{n-1}_{i=1} |h_i-h_{i+1}| ∑i=1n−1∣hi−hi+1∣ ,你需要找出一种交换方式,使得最终序列 { h n } \{h_n\} {hn} 的丑陋值最小化。
你不需要输出具体交换,只需要输出最终的 { h n } \{h_n\} {hn} 序列的丑陋值即可。
输入描述
第一行一个整数 n n n ,表示塔子哥的装饰品数量。
接下来一行 n n n 个整数 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an ,依次表示从左到右 n n n 个装饰品的高度。
对于所有的数据: 2 ≤ N ≤ 50000 2\le N \le 50000 2≤N≤50000 , 0 ≤ a i ≤ 1 0 9 0\le a_i \le 10^9 0≤ai≤109 。
输出描述
输出第一行一个数,为最优方案的最小丑陋值。
样例
输入
3
3 1 2
输出
2
样例解释
我们可以将3和1交换,得到
1 3 2
然后再将2和3交换,得到
1 2 3
可以证明,此时有最小丑陋值 ∣ 1 − 2 ∣ + ∣ 2 − 3 ∣ = 2 |1-2|+|2-3|=2 ∣1−2∣+∣2−3∣=2
题目思路
思路:贪心
将其升序排序,求一遍即可。其实等价于最大值 - 最小值。复杂度 O ( n ) O(n) O(n)
类似题目推荐
由于题目很简单,塔子哥并没有找到特别相似的题目。所以给大家找了一些排序 + 贪心的题目。普遍比本题难!
Leetcode
1.435 无重叠区间
2.406 根据身高重建队列
4.621 任务调度器
5.45 跳跃游戏 II
codefun2000
1.P1075 2023.3.12-飞机大战
2.P1077 2023.3.11-第一题-字符串修改
3.P1084 2023.3.15-第三题-k次操作最小化极差
4.P1089 2023.3.18.10点-第三题-塔子哥的回文串
代码
C++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int maxVal = *max_element(a.begin(), a.end());
int minVal = *min_element(a.begin(), a.end());
cout << maxVal - minVal << endl;
return 0;
}
python
n = int(input())
a = list(map(int,input().split()))
print(max(a)-min(a))
Java
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayList a = new ArrayList();
for (int i = 0; i < n; i++) {
a.add(scanner.nextInt());
}
int maxVal = Collections.max(a);
int minVal = Collections.min(a);
System.out.println(maxVal - minVal);
}
}
ps
Go和Js就不放了,实在简单。