给定一个有序数组arr,调整arr使得这个数组的左半部分
没有重复元素且升序,而不用保证右部分是否有序
例如,arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8, 9, .....]。
[要求]
时间复杂度为
,空间复杂度为
第一行一个整数N。表示数组长度。
接下来一行N个整数,表示数组内元素
输出N个整数为答案数组
16 1 2 2 2 3 3 4 5 6 6 7 7 8 8 8 9
1 2 3 4 5 6 7 8 9 6 2 7 2 8 8 3
5 2 3 4 4 5
2 3 4 5 4
本题有special judge,对于右边的部分,你可以任意输出(在保证合法的前提下)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strArr = br.readLine().split(" ");
int[] arr = new int[n];
for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]);
partition(arr);
for(int i = 0; i < n; i++) System.out.print(arr[i] + " ");
}
private static void partition(int[] arr) {
int orderedBound = 0, ptr = 1;
while(ptr < arr.length){
// 指针所指的元素跟有序区最后一个元素相等就直接走,不相等就跟有序区的下一个位置交换
if(arr[orderedBound] != arr[ptr])
swap(arr, ++orderedBound, ptr);
ptr++;
}
}
private static void swap(int[] arr, int i, int j) {
if(i != j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
} #include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; ++i) cin >> nums[i];
// 数组本身有序,定义快慢指针
int slow = 0, fast = 0;
while(fast < n){
// 碰到与 nums[slow] 不同的元素,把它换到 slow+1 位置
if(nums[slow] != nums[fast]){
slow++;
// 维护 nums[0..slow] ⽆重复
swap(nums[slow], nums[fast]);
}
fast++; // 相同元素就不断前进
}
for(int i = 0; i < n; ++i) cout << nums[i] << " ";
return 0;
} #include <iostream>
#include <algorithm>
#include <vector>
class Solution {
public:
static std::vector<int> getRearrangedList(std::vector<int>& lst) {
int lst_size = lst.size();
int max_v = lst[lst_size - 1];
int j = 0;
for (int i = 1; i < lst_size; ++i) {
if (lst[j] == max_v) {
break;
}
if (lst[i] > lst[j]) {
swap(lst[i], lst[j + 1]);
++j;
if (j + 1 > lst_size - 1) {
break;
}
}
}
return lst;
}
static inline void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
};
// main_b001
int main(int argc, char *argv[]) {
(void) argc;
(void) argv;
int n;
scanf("%d", &n);
std::vector<int> in1(n);
for (int i = 0; i < n; ++i) {
scanf("%d", &in1[i]);
}
std::vector<int> out1 = Solution::getRearrangedList(in1);
printf("%d", out1[0]);
for (int i = 1; i < n; ++ i) {
printf(" %d", out1[i]);
}
printf("\n");
return 0;
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
partition(arr);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(arr[i] + " ");
}
System.out.println(sb.toString());
}
//[0...left]区域都装着升序且不同的数字
//[left+1...right]装着不确定是否不同的数
//机制为,让right不停往右走,left记录不同数子数组的最后一个位置
//但凡碰到一个和arr[left]不同的数,就把它换到left+1位置,同时扩展
//[0...left]区间,且不用担心排序问题,因为原数组本来就是升序的,而且right
//也是从左到右遍历的
public static void partition(int[] arr) {
if (arr == null || arr.length == 0)
return;
int left = 0;
int right = 1;
while (right < arr.length) {
if (arr[right] != arr[left])
swap(arr, right, ++left);
right++;
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
} def sort_arry(n,l): i=0 j=0 while j<n and i<n-1: if l[j]!=l[i]: l[i+1],l[j]=l[j],l[i+1] i+=1 j+=1 for i in range(n): print(l[i],end=" ") def main(): n=int(input()) l=list(map(int,input().split())) sort_arry(n,l) if __name__=='__main__': main()
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] nums = Arrays.stream(br.readLine().trim().split(" ")).mapToInt(Integer::parseInt).toArray();
int slow = 0;
for(int fast = 1; fast < N; fast++){
if(nums[slow] != nums[fast]){
slow++;
int temp = nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
}
}
System.out.print(nums[0]);
for(int i = 1; i < N; i++){
System.out.print(" " + nums[i]);
}
System.out.println();
}
} import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.valueOf(bf.readLine());
String[] str = bf.readLine().split(" ");
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.valueOf(str[i]);
}
bf.close();
int pre = 1, latter = 1;
while (latter < n && pre < n) {
if (arr[pre] != arr[latter - 1]) {
int temp = arr[pre];
arr[pre] = arr[latter];
arr[latter] = temp;
latter++;
}
pre++;
}
StringBuilder sb = new StringBuilder();
for (int val : arr) {
sb.append(val + " ");
}
System.out.println(sb);
}
} import sys
len=int(sys.stdin.readline().split()[0])
arr=sys.stdin.readline().split()
flag=0
go=1
while flag<(len+1)/2:
if arr[flag]==arr[go]:
arr.append(arr[go])
arr.pop(go)
else:
go+=1
flag+=1
print(' '.join(arr)) 我觉得自己的想法没有问题,但是就是通不过测试, 怎么可能一个测试用例都通过不了,有大佬能帮忙看看吗?
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int>v(n);
for(int i=0;i<n;++i) cin>>v[i];
int i=0;
int cur = 1;
while(cur<n)
{
if(v[cur]==v[i])
++cur;
else
{
swap(v[++i],v[cur++]);
}
}
for(int i=0;i<n;++i)
cout<<v[i]<<" ";
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i] = scanner.nextInt();
}
int p = 0;
for(int i=1;i<n;i++){
if(arr[i] != arr[p]){
p++;
int temp = arr[i];
arr[i] = arr[p];
arr[p] = temp;
}
}
for(int i=0;i<n;i++){
System.out.print(arr[i]+" ");
}
}
}
#include<iostream>
using namespace std;
int main()
{
int N;
while(cin>>N)
{
int* arr=new int[N];
if(N==0)
{
break;
}
for(int i=0;i<N;i++) cin>>arr[i];
if(N==1)
{
cout<<arr[0]<<endl;
break;
}
int init_i=0;
int i=0;
while(init_i<(N+1)/2)
{
if(arr[i]>arr[init_i])
{
int temp=arr[i];
arr[i]=arr[init_i+1];
arr[init_i+1]=temp;
init_i++;
i++;
if(i>=N) break;
}
else
{
i++;
if(i>=N) break;
}
}
for(int i=0;i<N-1;i++) cout<<arr[i]<<' ';
cout<<arr[N-1]<<endl;
}
} 有没有大佬帮我看看是哪个case过不去?网上能找到的case都过了