笔试题就挂了系列:今日头条数据研发视频面试(正负数交替排序)

面试官上来让说快速排序与堆排(说,不是编),然后让说比较,区别,数据量大的情况下,哪种排序快;

之前记得说快速排序在数据量大的时候,是最快的排序算法(单线程,内部排序算法);

但是面试官说推排快(本人不太了解堆排),然后一直问我,让我说为什么我觉得快速排序排快;(没答上来)

(后来觉得,面试官可能故意说堆排快,让我去反驳,去表现。不然为什么一直追问我,为什么我觉得快速排序排快)

然后撸题:

题目:正负数排序:

给一串无序数组,包含有正负数(不含0);将数组排序成正负交替的数组,不改变原来数组的正数和负数各自的顺序:

若正负元素不等,直接把剩下元素放在数组后面:

例:-1,-3,5,-6,8    输出结果:5,-1,8,-3,-6

面试的时候思路都已经说出来了,设置正负标志位分别指向第一正数或负数,若负数下标-正数下标 !=1;则分情况交换数组;

但是面试的时候特别想快点码出来;结果心态不好,很急;

面试就挂掉了,所以,做题不可以浮躁,一步一步来。题目不难。但是心态很重要;

自己面完后,在下面敲了代码;大概25分钟,但是面试的时候40分钟都没敲出来;希望吸取教训;

最近要狂练代码了;编的少,水平不高!;见得少;让心态不好!

#include <iostream>
using namespace std;

void swap(int *arr,int p)
{
	int temp=arr[p-1];
	arr[p-1]=arr[p];
	arr[p]=temp;
}

void pnsort(int *arr,int size)
{
	int p=0;
	int n=0;
	if (size>1)
		while(n<size && p<size)
		{
			while(arr[p]<0)
				p++;
			while(arr[n]>0)
				n++;
			if(p>=size || n>=size)
				break;
			while(n-p!=1)//如果负下标-正下标==1;满足正负交替,不等于1;需要交换
			{
				if(n>p)//如果负数下标大,直接交换,并让负下标减一
				{
					swap(arr,n);
					n--;
				}
				else //如果负数下标小分情况
				{
					if (p-n==1)//如果正数下标和负数下标相邻,交换正负下标和元素
					{
						swap(arr,p);
						p--;
						n++;
					}
					else //如果正数下标和负数下标不相邻,交换正负下标和元素
					{
						swap(arr,p);
						p--;
					}
				}
			}
			n=n+1;//数组前n个数已满足正负交替;比较剩下的元素继续;
			p=p+2;
		}
}


int main()
{
	int arr[10]={-20,-32,12,-32,45,11,21,31,-41,33};
//	int arr[3]={-20,-32,-2};
	int size=10;
        pnsort(arr,size);
	int i=0;
	while(i<size)
	{
		cout<<arr[i]<<" ";
		i++;
	}
	cout<<endl;
	return 0;
}

最后说一下,我投的日常实习生(不是校招);反馈贼快,前一天t投第二天就通知面试时间,只有四天准备,慌得一批;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值