分析时间复杂度public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); String num[]=new String[N]; for(int i=0;i<N;i++) { int res=0; num[i]=sc.next(); if(ishui(num[i])) {//输入即回文 System.out.println(0+num[i]); break; } while(!ishui(num[i])) {//非回文 int a=0; int temp=Integer.valueOf(num[i]);//String转int while(temp!=0) { int n=temp%10; a=a*10+n; temp/=10; } temp=a+Integer.valueOf(num[i]);// num[i]=String.valueOf(temp); res++; } System.out.println(res+" "+num[i]); } } //判断字符串 private static boolean ishui(String a) { int i=0;int j=a.length()-1; while(i<j) { if(a.charAt(i)!=a.charAt(j)) { return false; } i++;j--; } return true; }
时间: 2024-04-28 11:21:22 浏览: 65
这段代码的时间复杂度分析如下:
1. 第1行创建了一个 Scanner 对象,时间复杂度为 O(1)。
2. 第2行读取一个整数 N,时间复杂度为 O(1)。
3. 第3行创建一个长度为 N 的字符串数组,时间复杂度为 O(N)。
4. 第4~18行的 for 循环中,每次迭代都会进行如下操作:
a. 第6行判断当前字符串是否为回文,时间复杂度为 O(N)。
b. 如果不是回文,则进入 while 循环。
c. while 循环中,第11行将字符串转换成整数,并且第16行将整数转换成字符串,这两个操作的时间复杂度均为 O(N)。
d. while 循环中,第12~15行的操作次数取决于字符串的长度 N,时间复杂度为 O(N)。
e. 循环次数最多为 N 次,因此整个 for 循环的时间复杂度为 O(N^2)。
5. ishui 函数的时间复杂度为 O(N)。
因此,整个程序的时间复杂度为 O(N^2)。
相关问题
解释代码public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int max=0; int sum=0; int[] arr = new int[n]; for(int i = 0;i < n;i++){ arr[i] = sc.nextInt(); sum = Math.max(sum + arr[i], arr[i]); max = Math.max(sum, max); } System.out.println(max); }
这段代码是一个求最大子段和的算法,其主要思路是使用动态规划。下面对代码进行解释:
1. 首先使用 Scanner 从控制台输入一个整数 n,表示接下来将输入 n 个整数。
2. 接下来定义一个长度为 n 的数组 arr,用于存储输入的 n 个整数。
3. 使用一个 for 循环,依次将 n 个整数存储到数组 arr 中。
4. 使用两个变量 max 和 sum 来记录最大子段和和当前子段和,初始值均为0。
5. 使用一个 for 循环,遍历数组 arr,对于每一个 arr[i],更新 sum:sum = Math.max(sum + arr[i], arr[i]),表示当前子段和为 sum + arr[i] 或者 arr[i] 中的最大值。
6. 在每次更新 sum 后,再更新 max:max = Math.max(sum, max),表示当前最大子段和为 sum 和 max 中的最大值。
7. 循环结束后,输出最大子段和 max。
这段代码的时间复杂度为O(n),是一种比较高效的求最大子段和的算法。
分析代码import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for(int i = 0;i < n;i++){ arr[i] = sc.nextInt(); } int sum = arr[0]; int max = arr[0]; //动态规划的方法 for(int i = 0;i < arr.length;i++){ sum = Math.max(sum + arr[i],arr[i]); max = Math.max(max,sum); } System.out.println(max); } }
这段代码实现了一个求最大子序和的算法,使用了动态规划的思想。具体分析如下:
1. 导入Java中的工具包java.util.*。
2. 定义了一个公共类Main。
3. 在main方法中,使用Scanner类从控制台读取一个整数n作为数组的长度,并且创建一个长度为n的整型数组arr。
4. 使用for循环遍历数组arr,依次将控制台输入的n个整数存储到数组arr中。
5. 定义了两个整型变量sum和max,分别表示当前最大子序和以及历史最大子序和,初始值都为数组的第一个元素arr[0]。
6. 使用for循环遍历数组arr,依次计算当前最大子序和和历史最大子序和。具体方法是:对于数组中的每一个元素arr[i],将其加到当前最大子序和sum上,然后和arr[i]取最大值,得到的结果再和历史最大子序和max取最大值,并将其赋值给max。
7. 输出历史最大子序和max。
通过这种动态规划的方式,可以在时间复杂度为O(n)的情况下,求出一个数组中的最大子序和。
阅读全文