import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class 1322 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String str = sc.next(); char []chars=str.toCharArray(); char []result=spy(n,chars); System.out.println(result); } public static char[] spy(int n,char[] chars){ int len=chars.length; ArrayList<Integer>[] ch = new ArrayList[128]; for (int i = 0; i < 128; i++) { ch[i] = new ArrayList<Integer>(); } for (int i = 0; i < chars.length; i++) { ch[chars[i]].add(i); } int[]next=new int[len]; int count=0; for (int i = 0; i < 128; i++) { for (int num : ch[i]) { next[count++]=num; } } char[] result=new char[len]; int index=n-1; for (int i = 0; i < len; i++) { result[i] = chars[index=next[index]]; } return result; } }解释这段代码并说出他的计算复杂度
时间: 2024-02-15 14:28:36 浏览: 181
这段代码实现了一种加密算法,输入一个整数n和一个字符串str,输出将str按照一定规则加密后的结果。具体实现是将字符串中的每个字符按照ASCII码值存储在一个ArrayList数组中,然后按照存储顺序重新排列,最后按照一定规则依次取出字符形成加密后的结果。
计算复杂度:
1. 输入和初始化操作的时间复杂度为O(1)。
2. 将字符串中的每个字符按照ASCII码值存储在ArrayList数组中,时间复杂度为O(n)。
3. 将存储在ArrayList数组中的字符重新排列,时间复杂度为O(n)。
4. 依次取出字符形成加密后的结果,时间复杂度为O(n)。
综上,该算法的时间复杂度为O(n)。
相关问题
package step1; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Scanner; public class Client { public static void main(String[] args) { List products = new ArrayList<String>(); … System.out.println("--------------------"); /********** Begin *********/ ///请用自定义的iterator实现products的反向遍历访问 /********** End *********/ } }按照要求补全代码,别给我乱改
### 自定义Iterator实现List的反向遍历
要在Java中通过自定义`Iterator`实现`List`的反向遍历,可以创建一个新的类继承`Iterator`接口并重写其方法。以下是详细的说明和代码示例。
#### 实现思路
为了实现反向遍历功能,需要维护一个索引变量用于跟踪当前访问的位置。初始时,该索引应设置为列表最后一个元素之后的一个位置(即`size()`)。每次调用`next()`方法时,将索引减一,并返回对应的元素;当索引小于零时,则表示已经到达起始位置,此时抛出`NoSuchElementException`异常[^1]。
下面是一个完整的解决方案:
```java
import java.util.*;
public class ReverseIterator<T> implements Iterator<T> {
private final List<T> list;
private int currentIndex;
public ReverseIterator(List<T> list) {
this.list = list;
this.currentIndex = list.size(); // 初始化指向最后一位后的状态
}
@Override
public boolean hasNext() {
return currentIndex > 0; // 如果还有未处理项则返回true
}
@Override
public T next() {
if (!hasNext()) throw new NoSuchElementException();
return list.get(--currentIndex); // 返回前先减少index值
}
}
// 测试类
class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
System.out.println("原始顺序:");
for (Integer num : numbers) {
System.out.print(num + " ");
}
System.out.println("\n反向顺序:");
ReverseIterator<Integer> reverseIt = new ReverseIterator<>(numbers);
while(reverseIt.hasNext()){
System.out.print(reverseIt.next() + " ");
}
}
}
```
上述程序展示了如何构建自己的`ReverseIterator`类以及它的基本使用方式。注意这里只实现了最基本的功能需求——能够从尾至头读取数据[^2]。
另外需要注意的是,在实际开发过程中如果涉及到并发修改等问题还需要考虑线程安全等因素[^3]。
#### 总结
此方案提供了一种灵活的方式来控制容器内项目的访问次序而无需依赖于特定框架所提供的工具函数如`Collections.reverse()`或者Stream API等高级特性[^4]。它允许开发者更精细地调整行为逻辑以适应不同场景下的特殊要求。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class Main{ public static void main(String[] args) throws IOException { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); int n; double need; double sum=0; String s[]=in.readLine().split(" "); n=Integer.parseInt(s[0]); need=Double.parseDouble(s[1]); String amount[]=in.readLine().split(" "); String price[]=in.readLine().split(" "); ArrayList<Mooncake> cakes=new ArrayList<Mooncake>(); for(int i=0;i<n;i++){ Mooncake cake=new Mooncake(); cake.setAmount(Double.parseDouble(amount[i])); cake.setSales(Double.parseDouble(price[i])); cake.setValues(Double.parseDouble(price[i])/Double.parseDouble(amount[i])); cakes.add(cake); } Collections.sort(cakes); for(Mooncake c: cakes){ if(need>=c.amount){ need=need-c.amount; sum+=c.amount*c.values; } else{ sum+=need*c.values; need=0; } if(need==0){ break; } } System.out.printf("%.2f",sum); } static class Mooncake implements Comparable<Mooncake>{ double amount; double sales; double values; public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } public double getSales() { return sales; } public void setSales(double sales) { this.sales = sales; } public double getValues() { return values; } public void setValues(double values) { this.values = values; } @Override public int compareTo(Mooncake arg0) { // TODO Auto-generated method stub return this.values>arg0.values?-1:1; } } }转c++
把Java代码转换成C++代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Mooncake {
double amount;
double sales;
double values;
bool operator<(const Mooncake& c) const {
return this->values > c.values;
}
};
int main() {
int n;
double need, sum = 0;
cin >> n >> need;
vector<Mooncake> cakes(n);
for (int i = 0; i < n; i++) {
cin >> cakes[i].amount;
}
for (int i = 0; i < n; i++) {
double price;
cin >> price;
cakes[i].sales = price;
cakes[i].values = price / cakes[i].amount;
}
sort(cakes.begin(), cakes.end());
for (const auto& c : cakes) {
if (need >= c.amount) {
need = need - c.amount;
sum += c.amount * c.values;
}
else {
sum += need * c.values;
need = 0;
}
if (need == 0) {
break;
}
}
printf("%.2f", sum);
return 0;
}
阅读全文
相关推荐

















