import java.util.*;
public class Main {
/*填坑法*/
public static int getIndex(int[] arr,int left,int right){
int pivot = arr[left];
while(left<right){
while(left<right&&arr[right]>=pivot){
right--;
}
if(left<right){
arr[left] = arr[right];
left++;
}
while(left<right&&arr[left]<=pivot){
left++;
}
if(left<right){
arr[right] = arr[left];
right--;
}
}
if(left==right){
arr[left] = pivot;
}
return left;
}
/*1.获取中轴点 index 2.中轴点左边递归 3.中轴点右边递归*/
public static void quickSort(int[] arr,int start,int end){
if(start<end){
int index = getIndex(arr,start,end);
quickSort(arr,start,index);
quickSort(arr,index+1,end);
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] line = sc.nextLine().replace("[","").replace("]","").split(",");
int[] arr = new int[line.length];
for(int i = 0;i<line.length;i++){
arr[i] = Integer.parseInt(line[i]);
}
//查找排序后第三大的元素
/*
Arrays.sort(arr);
*/
quickSort(arr,0,arr.length-1);
System.out.println(arr[arr.length -3]);
}
} #include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool compare(const int &a,const int &b)
{
return a>b;
}
int main()
{
int num;
vector<int> v;
while(getchar()!=']')
{
cin>>num;
v.push_back(num);
}
sort(v.begin(),v.end(),compare);
cout<<v[2];
} #include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> a;
string s;
cin >> s;
int cur, sign = 1;
for (int i = 1; i < s.length(); i++)
{
if (!isdigit(s[i]) && s[i] != '-')
{
a.push_back(cur * sign);
cur = 0;
sign = 1;
}
else if (isdigit(s[i]))
cur = cur * 10 + s[i] - '0';
else
sign = -1;
}
sort(a.begin(),a.end());
cout<<a[a.size()-3]<<endl;
return 0;
}
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static int getThirdest(int[] nums){
Arrays.sort(nums);
return nums[nums.length-3];
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String temp = in.nextLine();
String res = temp.substring(1,temp.length()-1);
String[] str = res.trim().split(",");
int len = str.length;
int[] num = new int[len];
for (int i=0;i<len;i++){
num[i] = Integer.parseInt(str[i]);
}
System.out.println(getThirdest(num));
}
} const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
ouput: process.stdout
})
let inArr = []
rl.on('line',line=>{
if(!line) return
inArr.push(line.trim())
if(inArr.length === 1){
let a = inArr[0]
a = JSON.parse(a)
a.sort((a,b) => b-a)
console.log(a[2])
}
}) #include <bits/stdc++.h>
using namespace std;
int main(){
vector<int> a;
string s;
cin>>s;
stringstream ss(s);
int x;
char c;
while(ss>>c){
if(c==']')
break;
ss>>x;
a.push_back(x);
}
priority_queue<int, vector<int>, greater<int>> q;
for(int i=0;i<a.size();i++){
if(q.size()<3)
q.push(a[i]);
else{
if(a[i]>q.top()){
q.pop();
q.push(a[i]);
}
}
}
cout<<q.top()<<endl;
return 0;
} 冒泡思想pop三趟就行。
不知道今天牛客怎么了,后台一直出错,自己在本地都可以AC。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> input;
int tmp;
while(cin>>tmp)
{
input.push_back(tmp);
if(cin.get()=='\n')
break;
}
int n=input.size();
for(int i=0;i<3;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(input[j]>input[j+1])
{
tmp=input[j+1];
input[j+1]=input[j];
input[j]=tmp;
}
}
}
cout<<input[n-3];
} #include <bits/stdc++.h>
using namespace std;
int mypartition(vector<int> &arr,int start,int end,int k){
int left=start,right=end;
int p=arr[left];
if(start<end){
while(left<right){
while(left<right&&arr[right]<=p)
right--;
arr[left]=arr[right];
while(left<right&&arr[left]>=p)
left++;
arr[right]=arr[left];
}
arr[left]=p;
if(left==k)
return arr[k];
else if(left>k)
return mypartition(arr,start,left-1,k);
else
return mypartition(arr,left+1,end,k);
}
}
int main(){
vector<int> arr(1,0);
cin.ignore();
while(1){
int t;
cin>>t;
arr.push_back(t);
if(cin.get()==']')
break;
}
int ans=mypartition(arr,1,arr.size()-1,3);
cout<<ans;
return 0;
}
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] strings = in.nextLine().replace("[","").
replace("]","").split(",");
int[] a = new int[strings.length];
int n = a.length;
for (int i=0;i<n;i++)
a[i] = Integer.parseInt(strings[i]);
int k = n-3;
int t = -1;
int low = 0,high = n-1;
while (t != k){
t = partition(a,low,high);
if (t > k)
high = t-1;
else if (t < k)
low = t+1;
}
System.out.println(a[t]);
}
public static int partition(int[] a,int low,int high){
int key = a[low];
while (low < high){
while (low < high && key <= a[high])
high--;
if (low < high)
a[low++] = a[high];
while (low < high && a[low] <= key)
low++;
if (low < high)
a[high--] = a[low];
}
a[low] = key;
return low;
}
} 在k已确定,且k并不是很大时,可以用这种方法,只需一次遍历 public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] strings = in.nextLine().replace("[","").
replace("]","").split(",");
int[] a = new int[strings.length];
int n = a.length;
for (int i=0;i<n;i++)
a[i] = Integer.parseInt(strings[i]);
int first = Integer.MIN_VALUE;
int second = Integer.MIN_VALUE;
int third = Integer.MIN_VALUE;
for (int i=0;i<n;i++){
if (a[i] > first){
third = second;
second = first;
first = a[i];
}else if (a[i] > second){
third = second;
second = a[i];
}else if (a[i] > third){
third = a[i];
}
}
System.out.println(third);
}
} #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
using namespace std;
int main() {
string input,tmp;
while (cin>>input) {
vector<int> array;
input.erase(input.end() - 1);
input.erase(input.begin());
stringstream inputline(input);
while(getline(inputline, tmp, ',')) {
auto v = stoi(tmp);
array.push_back(v);
}
sort(array.begin(),array.end());
cout<<array[array.size() - 3]<<endl;
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
String[] strNumber = str.substring(1, str.length() - 1).split(",");
int[] number = new int[strNumber.length];
for (int i = 0; i < strNumber.length; i++) {
number[i] = Integer.parseInt(strNumber[i]);
}
Arrays.sort(number);
System.out.println(number[number.length -3]);
}
}
我来给出这类题的通用解法,也就是求无序数组的第K大(或第K小)的问题,下面给出两种AC了的方法
import java.util.PriorityQueue;
import java.util.Scanner;
import static java.lang.Integer.parseInt;
import static java.lang.System.in;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(in);
String[] str = sc.nextLine().replace("[", "").replace("]", "").split(",");
int[] data = new int[str.length];
for (int i = 0; i < data.length; i++) {
data[i] = parseInt(str[i]);
}
System.out.println(findKthNum(data, 3));
System.out.println(findKthNum1(data, 3));
}
//方法1,基于快排思想的partion划分,时间复杂度O(n),空间复杂度O(1)
public static int findKthNum(int[] data, int k) {
int begin = 0, end = data.length - 1;
int pos = 0;
while (begin <= end) {
pos = partion(data, begin, end);
if (pos == k - 1) {
return data[pos];
} else if (pos > k - 1) {
end = pos - 1;
} else {
begin = pos + 1;
}
}
return -1;
}
private static int partion(int[] data, int begin, int end) {
int temp = data[begin];
while (begin < end) {
while (begin < end && data[end] <= temp) {
end--;
}
swap(data, begin, end);
while (begin < end && data[begin] > temp) {
begin++;
}
swap(data, begin, end);
}
return begin;
}
public static void swap(int[] arr, int i, int j) {
if (arr == null || i >= arr.length || j >= arr.length || i < 0 || j < 0) {
return;
}
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//方法2,建小顶堆,时间复杂度O(n*logk),空间复杂度O(k)
public static int findKthNum1(int data[], int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for (int item : data) {
if (heap.size() < k) {
heap.add(item);
} else if (item > heap.peek()) {
heap.poll();
heap.add(item);
}
}
return heap.poll();
}
}
#include<iostream>
#include<cstdio>
#include<limits.h>
using namespace std;
int main()
{
int x=INT_MIN,y=INT_MIN,z=INT_MIN;//x第一大,y第二大,z第三大
int k;
while(getchar()!=']')
{
cin>>k;
if(k>=x)
{
z=y; y=x; x=k;
}
else if(k>=y)
{
z=y; y=k;
}
else if(k>=z)
{
z=k;
}
else
continue;
}
cout<<z<<endl;
return 0;
} import java.util.Scanner;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
String[] str=input.nextLine().replace("[","").replace("]","").split(",");
int strInt[]=new int[str.length];
for(int i=0;i<str.length;i++){
strInt[i]=Integer.parseInt(str[i]);
}
Arrays.sort(strInt);
System.out.println(strInt[strInt.length-3]);
}
}
利用Arrays类的sort方法轻松解决
// 快速选择
import java.util.*;
class Solution {
public int findK(int[] arr, int k) {
int left = 0, right = arr.length - 1;
return fun1(arr, left, right, arr.length - k);
}
public int fun1(int[] arr, int left, int right, int k) {
if (left >= right) return arr[left];
int l = left - 1, r = right + 1, target = arr[left];
while (l < r) {
do l++;
while (l <= right && arr[l] < target);
do r--;
while (r >= left && arr[r] > target);
if (l < r) {
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
if (k <= r) return fun1(arr, left, r, k);
else return fun1(arr, r + 1, right, k);
}
}
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
// 去掉首尾的方括号
str = str.substring(1, str.length() - 1);
String[] arr = str.split(",");
int[] nums = new int[arr.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(arr[i]);
}
Solution solution = new Solution();
System.out.println(solution.findK(nums, 3));
}
}