上海交通大学计算机考研复试 2014年(java)

问题一:
题目描述

求含有重复字符的字符串的全排列

输入描述:

一个字符串

输出描述:

一个字符串为一行

示例1
输入

pass

输出

apss
asps
assp
pass
psas
pssa
saps
sasp
spas
spsa
ssap
sspa
import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
	static boolean[] visited;
	static char[] ch;
	static int len;
    public static void main(String[] args){
    	try {
	        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
	        String str;
	        while((str = br.readLine()) != null) {
	        	len = str.length();
	        	visited = new boolean[len];
	        	ch = str.toCharArray();
	        	Arrays.sort(ch);
	        	backtrack(new char[len], 0);
	        }
 	    } catch (IOException e) {
	        e.printStackTrace();
	    }
    }
    public static void backtrack(char[] res, int count) {
    	if(count == len) {
    		System.out.println(res);
    		return;
    	}
    	for(int i = 0; i < len; i++) {
    		if(visited[i]) continue;
    		if(i > 0 && ch[i] == ch[i-1] && visited[i-1]) continue;
    		res[count] = ch[i];
    		visited[i] = true;
    		backtrack(res, count+1);
    		visited[i] = false;		
    	}
    }
}

问题二:
题目描述

输入含有多个字符串和一个整数k。规定两个相邻字符串的距离为1。要求任意调整这n个字符串,最终使得任意两个相同字符串的距离不小于k。

输入描述:

这些字符串是在第一行且是用空格隔开的

输出描述:

如果存在这种调整,输出Yes,否则输出No

示例1
输入

I was Fred eating Fred

输出

Yes
import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
	static HashMap<String, Integer> map;
	static boolean[] visited;
	static int len;
	static int k;
    public static void main(String[] args){
    	try {
	        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
	        String str;
	        
	        while((str = br.readLine()) != null) {
	        	map = new HashMap<>();
	        	k = Integer.parseInt(br.readLine());
	        	String[] parts = str.split(" ");
	        	len = parts.length;
	        	visited = new boolean[len];
	        	for(int i = 0; i < len; i++) {
	        		if(!map.containsKey(parts[i])) map.put(parts[i], 1);
	        		else map.put(parts[i], map.get(parts[i])+1);
	        	}
	        	if(getRes()) System.out.println("Yes");
	        	else System.out.println("No");
	        }
 	    } catch (IOException e) {
	        e.printStackTrace();
	    }
    }
    public static boolean getRes() {
    	int begin = 0;
    	int cur;
    	ArrayList<Word> wordList = new ArrayList<>();
    	for(Map.Entry<String, Integer> entry: map.entrySet()) {
    		wordList.add(new Word(entry.getKey(), entry.getValue()));
    	}
    	Collections.sort(wordList, new Comparator<Word>() {
    		public int compare(Word o1, Word o2) {
    			return o2.value - o1.value;
    		}
    	});
    	for(Word w : wordList) {
    		while(begin < len && visited[begin]) begin++;
    		if(begin >= len) return false;
    		if(!visited[begin]) {
    			visited[begin++] = true;
    		}
    		cur = begin;
    		for(int i = 1; i < w.value; i++){
    			cur += k-1;
    			if(cur >= len) return false;
    			while(cur < len && visited[cur]) cur++;
    			if(cur >= len) return false;
    			visited[cur] = true;
    		} 
    	}   
    	return true;
    }
}
class Word{
	String str;
	int value;
	Word(String a, int b) {
		str = a;
		value = b;
	}
}

问题三:
题目描述

输入共m+1行(这句话是我加的,题目就是这个意思)。一个m行n列矩阵,相邻两个元素用空格隔开。m,n可能很大(题目没有给出具体值)。每个元素的值为1,0,-1其中的一个。第m+1行(这个在试卷里面没有说明,监考老师补充的,按照监考老师的说法是最后一行)为一个换行符。
规定两个元素a[i][j], a[m][t]属于一个group,当且仅当满足以下条件:
(1)|j-t| = 1 且 i=m或者 |i-m| = 1 且 j=t 
(2)a[i][j] = a[m][t] != 0
要求输出group数目。非法矩阵输出 -1

输入描述:

输入共m+1行(这句话是我加的,题目就是这个意思)。一个m行n列矩阵,相邻两个元素用空格隔开。

输出描述:

要求输出group数目。非法矩阵输出 -1

示例1
输入

0 0 1 1 0
0 -1 -1 -1 0
0 1 -1 0 0
0 1 -1 -1 0

输出

7(不确定)
import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
	static HashMap<String, Integer> map;
	static boolean[] visited;
	static int len;
	static int k;
    public static void main(String[] args){
    	try {
	        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
	        String str;
	        int[][] dir = {{-1,0},{1,0},{0,-1},{0,1}};
	        ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
	        while((str = br.readLine()) != null) {
	        	if(str.length() == 0) break;
	        	ArrayList<Integer> tmp = new ArrayList<>();
	        	String[] parts = str.split(" ");
	        	for(int i = 0; i < parts.length; i++) {
	        		tmp.add(Integer.parseInt(parts[i]));
	        	}
	        	matrix.add(new ArrayList<>(tmp));
	        }
	        int m = matrix.size();
	        int n = matrix.get(0).size();
	        boolean mark = false;
	        int group = 0;
	        for(int i = 0; i < m; i++) {
	        	ArrayList<Integer> tmp = matrix.get(i);
	        	if(tmp.size() != n) {
	        		mark = true;
	        		break;
	        	}
	        	for(int j = 0; j < n; j++) {
	        		if(matrix.get(i).get(j) == 0) continue;
	        		for(int k = 0; k < 4; k++) {
	        			int x = i+dir[k][0];
	        			int y = j+dir[k][1];
	        			if(x < 0 || y < 0 || x >= m || y >= n) continue;
	        			if(matrix.get(i).get(j) == matrix.get(x).get(y)) group++;
	        		}
	        	}
	        }
	        if(mark) System.out.println("-1");
	        else System.out.println(group/2);
 	    } catch (IOException e) {
	        e.printStackTrace();
	    }
    }
}


发布了332 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43306331/article/details/105078941