《2017.3牛客网》统一模拟笔试编程题(2)

如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。 
输入描述:
输入包括n+1行:

第一行为单词个数n(1 ≤ n ≤ 50)

接下来的n行,每行一个单词word[i],长度length(1 ≤ length ≤ 50)。由小写字母构成


输出描述:
输出循环单词的种数

输入例子:
5
picture
turepic
icturep
word
ordw

输出例子:

2

思路:主要为一个判断两个String是否是循环单词的函数,我的打算是(String a,String b),如果a.append(a)中包含b,且移除b部分之后还剩余一个a,则a与b是循环单词。而在判断一个数组内的循环单词数目时,则借助一个set或者list存储已经确定为循环单词的数组位置,只有容器中没有存储此循环单词的数组位置是,循环单词数目才增加,具体代码如下:

package basicTest;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Test2 {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		//System.out.println("输入单词个数N:");
		int n = s.nextInt();
		//System.out.println("输入各单词:");
		String[] word = new String[n];
		for(int i=0; i<word.length ; i++) {
			word[i] = s.next();
		}
		//String[] word = {"goran","igor","domagoj","relia"};
		System.out.println(findCount(word));
	}
	
	
	public static int findCount(String[] word) {
		int countNum = 0;
		Set<Integer> set = new HashSet<>();
		for(int i=0; i<word.length; i++) {
			for(int j= i ; j<word.length; j++) {
				if( comparaR(word[j],word[i]) ){
					if(set.contains(i) || set.contains(j)) {
						set.add(i);
						set.add(j);
					} else {
						set.add(i);
						set.add(j);
						countNum ++;
					}
				}
			}
		}
		return countNum;
	}
	
	public static boolean comparaR(String a,String b) {
		boolean isRound = false;
		StringBuffer sb;
		int index;
		if(a.length() == b.length()) {
			sb = new StringBuffer(a);
			index = sb.append(a).indexOf(b);
			if( index >=0 && sb.replace(index, index + a.length(), "").toString().equals(a)) {
				isRound = true;
			}
		} 
		return isRound;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值