这是来自hackerearth的问题:
Sherlock和Watson正在玩交换游戏。沃森给Sherlock一个字符串S,他在该字符串上执行了K个交换。您需要帮助Sherlock查找原始字符串。 以这种方式对字符串进行一次交换:
假设索引为1,则将第i个字母从末尾插入第i个和第(i + 1)个字母之间。 例如,我们有“比赛”。交换一次后,它将更改为“ ctosnet”。
查看此图片: click to view image
可以通过并通过所有测试用例的代码:
Scanner sc=new Scanner(System.in);
int k=sc.nextInt();
String s=sc.next();
int n=s.length();
String str[]=new String[1000];
StringBuilder sb1=new StringBuilder(s);
int i=0;
int x=0;
//str[x++]=sb1.toString();
while(true){
StringBuilder sb=new StringBuilder();
i=0;
while(i<=n-1){
sb.append(sb1.charAt(i));
i+=2;
}
if(n%2!=0)
i=i-3;
else
i=i-1;
while(i>0){
sb.append(sb1.charAt(i));
i-=2;
}
sb1=sb;
//System.out.println(x);
x++;
str[x]=sb1.toString();
if(sb1.toString().equals(s))
break;
}
System.out.println(str[k%x]);
我的代码在一些输入中显示了TLE:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int k=Integer.parseInt(br.readLine());
String s=br.readLine();
int n=s.length();
StringBuilder sb1=new StringBuilder(s);
int i;
while(k-->0){
StringBuilder sb=new StringBuilder();
i=0;
while(i<=n-1)
{
sb.append(sb1.charAt(i));
i+=2;
}
if(n%2!=0)
i=i-3;
else
i=i-1;
while(i>0)
{
sb.append(sb1.charAt(i));
i-=2;
}
sb1=sb;
}
System.out.println(sb1.toString());
我的代码在何时何地具有较高的时间复杂性?因为我在程序中有k次最少的循环次数,而另一个则有k次以上的循环次数。 我在哪里错过了使用BufferedReader而不是Scanner类的复杂性?