微软2014年4月 实习生招聘机试题 3.Reduce inversion count

Time Limit: 10000ms
Case Time Limit: 1000ms
Memory Limit: 256MB

Description

Find a pair in an integer array that swapping them would maximally decrease the inversion count of the array. If such a pair exists, return the new inversion count; otherwise returns the original inversion count.

Definition of Inversion: Let (A[0], A[1] ... A[n]) be a sequence of n numbers. If i < j and A[i] > A[j], then the pair (i, j) is called inversion of A.

Example:
Count(Inversion({3, 1, 2})) = Count({3, 1}, {3, 2}) = 2
InversionCountOfSwap({3, 1, 2})=>
{
  InversionCount({1, 3, 2}) = 1 <-- swapping 1 with 3, decreases inversion count by 1
  InversionCount({2, 1, 3}) = 1 <-- swapping 2 with 3, decreases inversion count by 1
  InversionCount({3, 2, 1}) = 3 <-- swapping 1 with 2 , increases inversion count by 1
}


Input

Input consists of multiple cases, one case per line.Each case consists of a sequence of integers separated by comma.

Output

For each case, print exactly one line with the new inversion count or the original inversion count if it cannot be reduced.


Sample In

3,1,2
1,2,3,4,5

Sample Out

1
0

 

 

个人给出的一个解,找逆序用归并排序,找逆序最大减少数用暴力计算法:

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;

#define USE_IFSTREAM 1

int gCount = 0; //统计逆序个数

template<class T,class Iterator>
int merge(Iterator begin, Iterator mid, Iterator end)
{
	Iterator iL = begin;
	Iterator iR = mid;

	int count = distance(begin, end);
	vector<T> v(count);
	vector<T>::iterator it = v.begin();

	while(iL != mid && iR != end)
	{
		if(*iL <= * iR)
		{
			*it++ = *iL++;
		}
		else
		{
			gCount += distance(iL, mid);
			*it++ = *iR++;
		}
	}

	if(iL == mid) copy(iR, end, it);
	if(iR == end) copy(iL, mid, it);

	copy(v.begin(), v.end(), begin);

	return 0;

}

template<class T,class Iterator>
int mergeSort(Iterator begin, Iterator end)
{
	int count, step;
	count = distance(begin, end);

	if(count <= 1)
	{
		return 0;
	}

	step = count / 2;

	mergeSort<T>(begin, begin + step);
	mergeSort<T>(begin + step, end);

	merge<T>(begin, begin + step, end);

	return 0;

}
/*寻找最大减少逆序数*/
template<class T,class Iterator>
int findMaxDecInv(Iterator begin, Iterator end)
{
	int sumTmp =0;
	int maxDecInv=0;
#if 0
	Iterator i=begin ;
	iterator j=begin ;
	iterator k=begin ;
#endif
	Iterator i,j,k;
	for(i= begin;i<end;i++){
		for(j=i+1;j<end;j++){
			if(*j<*i){
				sumTmp = 1;
				for(k=i+1;k<j;k++)
					if((*k>*j)&&(*k<*i))
						sumTmp +=2;
				if(sumTmp > maxDecInv)
					maxDecInv = sumTmp;
			}
		}
	}
	return maxDecInv;

}



int main(){

	string str;
	int length=0;
	int i=0;
	char ch =0;
	int tmp = 0;
	int totalNum=0;
	int maxDecInv =0;
	//int* ptr ; 
	vector<int> vec(100);//这里先开辟10000,还会自动扩展
	vector<int> vecBackUp(100);
	vector<int>::iterator ite = vec.begin();
	
#ifdef USE_IFSTREAM
	ifstream ifs=ifstream("testCase.txt");
#endif

	while(1){
		//str.clear();
		gCount = 0;
		vec.assign(100,0);
		ite=vec.begin();
		totalNum = 0;
		i = 0;
#ifndef USE_IFSTREAM
		getline(cin,str);
#else  
		if(ifs.eof())
			break;
		getline(ifs,str);

#endif
		length = str.length();
		//ptr = new int[length];
		while(i<length){
			tmp = 0; 
			while((i<length)&&((ch=str[i++]) != ',')){
				tmp = (tmp*10)+(ch-'0');
			}
			*ite++ = tmp;
			totalNum++;

		}
		vecBackUp = vec;

		mergeSort<int>(vec.begin(),ite);

		if(gCount==0){
			cout<<0<<endl;
		}
		else{
			int dis = distance(vec.begin(),ite);
			vector<int>::iterator begin= vecBackUp.begin();
			maxDecInv = findMaxDecInv<int>(begin,begin+dis);
			cout<<(gCount-maxDecInv)<<endl;
		}

		
	}
}


 

<think>我们正在处理用户的问题:用户在执行`sudo ./inversion`时遇到了“command not found”错误。我们需要帮助用户解决这个问题。 根据用户提供的信息,错误信息是“command not found”,这通常意味着: 1. 文件`inversion`在当前目录下不存在。 2. 用户没有执行该文件的权限。 3. 该文件不是一个可执行文件,或者缺少解释器(例如,它是一个脚本但没有正确的shebang,或者缺少运行它的解释器)。 此外,用户使用了`sudo`,这可能会改变环境变量(如PATH)和当前工作目录,因此我们需要考虑这些因素。 解决步骤: 1. **确认文件存在**: 首先,用户需要确认当前目录下确实有一个名为`inversion`的文件。可以使用`ls`命令来查看。 建议用户运行: ```bash ls -l ./inversion ``` 如果文件不存在,那么需要用户检查是否在正确的目录下,或者是否文件名称拼写错误(注意大小写)。 2. **检查文件权限**: 如果文件存在,那么检查文件的执行权限。使用`ls -l`可以查看权限。通常,可执行文件需要有“x”权限。 如果没有执行权限,可以使用`chmod`命令添加: ```bash chmod +x ./inversion ``` 3. **检查文件类型**: 如果文件是一个脚本(如shell脚本、Python脚本等),需要确保第一行有正确的shebang(例如`#!/bin/bash`或`#!/usr/bin/env python`)并且对应的解释器已安装且路径正确。 另外,如果文件是二进制文件,需要确保它适用于当前系统的架构(例如,不能在ARM上运行x86的二进制文件)。 4. **使用完整路径**: 有时候,使用`sudo`时,当前工作目录可能会改变(尤其是当sudo配置了`secure_path`或重置环境时)。因此,建议使用完整路径来执行: ```bash sudo /full/path/to/inversion ``` 5. **检查文件内容**: 如果上述步骤都无效,可能是文件本身有问题。用户可以使用文本编辑器查看文件内容(如果是文本文件)或使用`file`命令检查文件类型: ```bash file ./inversion ``` 6. **依赖问题**: 如果该可执行文件依赖某些库,使用`sudo`运行时可能会因为环境变量(如`LD_LIBRARY_PATH`)未设置而找不到库。这时需要确保依赖库已安装,并在必要时设置环境变量。 7. **考虑sudo的环境**: 使用`sudo`时,环境变量可能会被重置。可以尝试使用`sudo -E`来保留当前用户的环境变量,但要注意安全。 或者,可以尝试切换到root用户,然后运行: ```bash sudo su cd /current/directory ./inversion ``` 8. **如果文件是脚本,检查解释器是否存在**: 例如,如果脚本开头是`#!/usr/bin/env python`,那么确保`python`在`/usr/bin/env`的查找路径中,并且已安装。 根据引用[1]中提到的路径,用户可能是在编译或开发环境中操作,因此需要确保所有依赖的库和工具链已正确安装。 由于用户的问题描述中提到了“inversion”命令,但没有提供更多上下文,我们只能给出一般性的解决方案。 如果用户按照以上步骤仍然无法解决,可能需要提供更多信息,例如: - 文件`inversion`的来源(是自己编译的,还是下载的?) - 系统环境(操作系统,架构等) - 错误发生的具体目录 - 文件的具体类型(是二进制文件还是脚本?) 生成相关问题: 1. 如何给Linux文件添加可执行权限? 2. 如何检查Linux文件的类型? 3. 在sudo环境下如何保留当前用户的环境变量? 4. 如何解决共享库找不到的问题? 5. 如何设置脚本的正确shebang? 现在,我们按照用户要求的结构化方式回答:</think>### 解决 `sudo ./inversion: command not found` 错误 当运行 `sudo ./inversion` 时出现 `command not found` 错误,通常由以下原因导致。请按顺序排查: --- ### 1. **文件路径或名称错误** - **检查当前目录**:确保 `inversion` 文件存在于当前目录: ```bash ls -l ./inversion ``` 若输出 `No such file or directory`,说明文件不存在或文件名拼写错误(注意大小写敏感)。 - **使用完整路径**: ```bash sudo /完整路径/inversion # 例如 sudo /home/user/project/inversion ``` --- ### 2. **缺少可执行权限** - **添加执行权限**: ```bash chmod +x inversion # 赋予执行权限 ls -l inversion # 验证权限是否包含 "x"(如 -rwxr-xr-x) ``` - 重新运行: ```bash sudo ./inversion ``` --- ### 3. **文件类型不兼容** - **检查文件类型**: ```bash file ./inversion ``` - 若输出 `ELF`:表示是二进制可执行文件,但可能架构不兼容(如 x86 程序运行在 ARM 设备)。 - 若输出 `script`:需确认解释器是否存在(如 `#!/bin/bash` 或 `#!/usr/bin/env python`)。 - **解决方案**: - 二进制文件:重新编译为当前系统架构的版本。 - 脚本文件:安装所需解释器(如 `sudo apt install python3`)。 --- ### 4. **依赖库缺失** - **动态链接库问题**: ```bash ldd ./inversion # 检查依赖库 ``` 若输出 `not found`,需安装缺失库(如 `sudo apt install libxxx`)。 - **`sudo` 环境变量问题**: `sudo` 可能重置 `PATH` 或 `LD_LIBRARY_PATH`。尝试: ```bash sudo env PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./inversion ``` --- ### 5. **文件损坏或格式错误** - **验证文件内容**: ```bash head -n 1 ./inversion # 检查首行是否包含正确的 shebang(如 #!/bin/bash) ``` - 重新下载或编译文件,确保无损坏。 --- ### 6. **文件系统挂载问题(如 noexec)** - **检查挂载选项**: ```bash mount | grep "当前目录所在分区" ``` 若包含 `noexec`,表示禁止执行该分区下的文件。 - **解决方案**: - 将文件移动到其他分区(如 `/home`)。 - 重新挂载分区(需 root 权限,谨慎操作): ```bash sudo mount -o remount,exec /目标分区 ``` --- ### 总结步骤 1. 确认文件存在且路径正确 → `ls ./inversion` 2. 添加执行权限 → `chmod +x inversion` 3. 检查文件类型和依赖 → `file ./inversion; ldd ./inversion` 4. 修复环境变量 → `sudo env PATH=$PATH ./inversion` 5. 排除挂载限制 → 移动文件或修改挂载选项 若问题仍存在,请提供以下信息: - `file ./inversion` 的输出 - `ls -l ./inversion` 的结果 - 系统架构(`uname -m`) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值