Baidu笔试-01序列排序的交换次数

问题描述:

问题分析:

解法一:设置双指针,start,end;当data[start]=‘1’,data[end]=’0’时,表示需要进行交换,次数加1;否则data[end]=’1’则前移end指针;data[start]=‘0’则后移start指针;

该算法仅需遍历一次

解法二:先遍历一次计算字符数组中0的个数zero,再计算前zero个字符中1的个数,即是要交换到后面的字符(仅需遍历到zero个字符即可);

代码:

解法一:

import java.util.Scanner;

public class Main1 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		//记录有多少组数据
		int data_length = in.nextInt();

		//第一层循环
		for (int i = 0; i < data_length; i++) {
			String str = in.next();
			char[] chars = str.toCharArray();
			int start = 0;
			int end = chars.length - 1;
			int result = 0;
			while(start < end)
			{
				if (chars[start] == '1' && chars[end] == '0') {
					++result;
					start ++;
					end --;
				}
				else
				{
					if(chars[end] == '1')
					{
						end --;
					}
					if(chars[start] == '0')
					{
						start ++;
					}
				}
			}
			System.out.println(result);
		}
	}
}
解法二:
import java.util.Scanner;

public class Main1 {

	public static void main(String args[]) {

		Scanner in = new Scanner(System.in);	

		int n = in.nextInt();

		while (n-- != 0) {

			int zero = 0, swap = 0;
			String str = in.next();

			for (int i = 0; i < str.length(); i++)
				if (str.charAt(i) == '0')
					zero++;

			for (int i = 0; i < zero; i++)
				if (str.charAt(i) == '1')
					swap++;

			System.out.println(swap);
		}
	}
}

时间: 2024-10-11 10:50:00

Baidu笔试-01序列排序的交换次数的相关文章

Cycle Sort (交换次数最少的排序)

该算法的效率并不高.但是却提供了一个很好的思路.如何让一个序列在最小交换次数下实现有序. Cycle Sort 翻译成中文是 圈排序. 这个圈在于需要交换的数据形成圈. 具体一点: 如: Array  4 3 2 5 5 6  要处理的数组 Result 2 3 4 5 5 6  结果 pos     0 1 2 3 4 5  下标 从下标0的元素开始观察.4 需要到下标 2 而下标2的元素为 2 需要到下标0 .刚好可以回到4. 也就是形成了 4-2 这样的圈 接下来是3 需要到下标1 而3本

关于一个求最小交换次数的算法的一个严格证明,是严格证明,不是想当然

问题描述: 有一个1~n的数列的排列,但是这个数列已经被打乱了排列顺序,如果我们只是通过"交换任意两个元素",那么,要实现元素从1~n的有序排列,"最少的交换次数是多少?" 解答过程: 首先我们纸上可以先写写简单的情况试试,比如排列:4 3 1 2, 交换次数=3:我们可以在多组测试中,边测试边想,真正的实现需要满足:4本该到2处, 2本该到3处, 3本该到1处, 1本该到4处,刚好一个循环. 于是,考虑: 引理:是否对于满足这种一个循环的排列,最少交换次数等于元素

序列中的交换问题

一.逆序对系列问题 题目:http://poj.org/problem?id=1804 题意:给定一个序列a[],每次只允许交换相邻两个数,最少要交换多少次才能把它变成非递降序列. 求逆序对的裸题. 如果我们交换相邻两个数,我们逆序对的个数只能是+1或-1 我们现在需要得到一个非递减数列,即消去所有逆序对, 而我们需要最少交换次数,即统计原数组中逆序对个数. 对于一个序列中,有Ai>Aj,i<j的两个元素,我们把这个二元组称为逆序对 有常见的三种方法求逆序对 1.n^2的冒泡 2.树状数组 可

neu 1493 Caoshen like math(最小交换次数)

http://acm.neu.edu.cn/hustoj/problem.php?cid=1047&pid=4 题意:数字1到n 任意排列 求排列成有序序列最少交换次数 思路:求最小交换次数有两种 1 交换的两数必须相邻  (poj 2299) 通过归并排序求出其逆序数即为所求值 证明:可以先将最大数交换到最后,由于是相邻两个数交换,需要交换的次数为最大数后面的数的个数(可以看做是最大数的逆序数),然后,交换过后,去除最大数,再考虑当前最大数也需要其逆序数次交换.则每个数都需要交换其逆序数次操作

POJ 2299-Ultra-QuickSort(归并排序求相邻元素的交换次数)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 43816   Accepted: 15979 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

【算法28】冒泡排序中的交换次数问题

问题描述 题目来源:Topcoder SRM 627 Div2 BubbleSortWithReversals 给定待排序数组A,在最多反转K个A的不相交子数组后,对A采用冒泡排序,问最小的swap次数是多少?冒泡排序的伪代码如下: BubbleSort(A): 循环len(A) - 1次: for i from 0 to len(A) - 2: if (A[i] > A[i+1]) swap(A[i], A[i+1]) 问题分析 首先,容易分析得到:对于任意待排序数组A,其采用冒泡排序所需要的

序列排序

洛谷题目链接:序列排序 题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? 输入输出格式 输入格式: 第一行,一个整数N. 第二行,N个整数,表示小C的序列. 输出格式: 一行,一个整数,表示小C需要的最小代价. 输入输出样例 输入样例#1: 6 8 4 5 3 2 7 输出样例#1: 34 说明 数据范围: 对于30%的数据,1<=N<=10: 对于全部的数据,1&l

zjut 1204 01串排序

01串排序  Time Limit:1000MS  Memory Limit:32768K Description: 将01串首先按长度排序,长度相同时,按1的个数多少进行排序,1的个数相同时再按ASCII码值排序. Input: 输入数据中含有一些01串,01串的长度不大于256个字符. Output: 重新排列01串的顺序.使得串按基本描述的方式排序. Sample Input: 10011111 00001101 1010101 1 0 1100 Sample Output: 0 1 11

冒泡排序的交换次数

题意: 给定一个1~n的排列a0,a1,-an-1,求对这个数列进行冒泡排序所需要的交换次数(冒泡排序是每次找到满足ai>ai+1的i,并交换ai和ai+1,直到这样的i不存在为止的算法). 限制条件:1<= n<= 100000 输入: n=4, a={3,1,4,2} 输出: 3 冒泡排序的复杂度是O(n2),所有无法通过模拟冒泡排序的过程来计算需要的交换次数.不过我们可以通过选取适当的数据结构来解决这个问题. 首先,所求的交换次数等价于满足i<j,ai>aj的(i,j)