链接: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;
}
}