【编程题m_0009】序列交换

链接:https://www.nowcoder.com/questionTerminal/f114f634de38401684edff5f841a95a2
来源:牛客网

牛牛有一个长度为n的整数序列s,羊羊要在牛牛的序列中选择不同的两个位置,然后交换这两个位置上的元素。现在需要求出羊羊交换后可以得到的不同的序列个数。(注意被交换的两元素值可能相同)。
如序列{1, 47},输出1.羊羊必须交换仅有的两个元素,得到序列{47, 1}。羊羊必须交换,不能保留原有的序列。
{1, 2, 1},输出3.羊羊通过交换可以得到{2, 1, 1},{1, 1, 2},{1, 2, 1}这三个序列。

输入描述:

输入包括两行,第一行为一个整数n(2 ≤ n ≤ 50),即序列的长度。
第二行n个整数,表示序列的每个元素a_i(1 ≤ a_i ≤ 50),以空格分割。

输出描述:

输出一个整数,表示羊羊可以得到的不同的序列个数

示例1

输入

3
1 2 1

输出

3

解题思路:每个数与它后面的每个数交换一次,将新序列转换成字符串,统计不同字符串的个数

package BiShiTi;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class m_0009 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String str1 = scan.nextLine();
		String str2 = scan.nextLine();
		
		int n = Integer.parseInt(str1);
		String [] a_i_Str = str2.split(" ");
		int [] a_i = new int[n];
		for (int i = 0; i < n; i++) {
			a_i[i] = Integer.parseInt(a_i_Str[i]);
		}
		
		long seqNum = DiffSeqNum(n, a_i);
		System.out.println(seqNum);
	}
	
	static long DiffSeqNum(int n, int [] a_i){
		Map<String, Integer> seqMap = new HashMap();
		long seqNum = 0;
		for (int i = 0; i < n-1; i++) {
			for (int j = i+1; j < n; j++) {
				int [] tempArr = (int [])a_i.clone();
				
				// 交换
				int tempVar = 0;
				tempVar = tempArr[i];
				tempArr[i] = tempArr[j];
				tempArr[j] = tempVar;
				String seqStr = Arrays.toString(tempArr);
				// 两端的中括号去不去掉均可
				// seqStr = seqStr.substring(1, seqStr.length()-1);
				
				if (seqMap.containsKey(seqStr)) {
					continue;
				}else {
					seqMap.put(seqStr, 1);
				}
				
			}
		}
		
		for (int seq : seqMap.values()) {
			seqNum += seq;
		}
		
		return seqNum;
	}
}

猜你喜欢

转载自my.oschina.net/MasterLi161307040026/blog/1811098
今日推荐