字符串第一个只出现一次字符_计算字符串的编辑距离_ 星际密码
找出字符串中第一个只出现一次的字符
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str = sc.nextLine(); int[] table = new int[128];//字符的ASCII码 范围 0-127! char[] strchs = str.toCharArray();//将字符串转换成字符数组! for(int i = 0;i<strchs.length;i++){ //通过table数组将 该字符出现位置标记! table[strchs[i]]++; } int i = 0; for(i = 0;i< strchs.length;i++){ //遍历获取结果! //找的顺序和标记的顺序相同 所以 保证打印第一个只出现一次的字符 if(table[strchs[i]]==1){ System.out.println(strchs[i]); break; } } if(i==strchs.length){ //不存在该字符! System.out.println(-1); } } }
这里利用了 字符ASCII
码范围,通过标记表table
计算字符串的编辑距离
import java.util.*; public class Main{ public static int distancefun(String str1,String str2){ int row = str1.length(); int col = str2.length(); int[][] dp = new int[row+1][col+1]; //初始状态:f(i,0) = i; f(0,j) = j; //状态转移: f(i,j) = str[i]==str2[j]? f(i-1,j-1): min(f(i-1,j),f(i,j-1),f(i-1,j-1))+1 //状态定义: f(i,j) str1 前 i 个子串和 str2 前j 个子串的最小编辑距离 //返回结果:f(row,col); for(int i = 0;i<= row;i++){ dp[i][0] = i; } for(int i = 0;i<=col;i++){ dp[0][i] = i; } for(int i = 1;i<=row;i++){ for(int j = 1;j<=col;j++){ if(str1.charAt(i-1)==str2.charAt(j-1)){ dp[i][j] = dp[i-1][j-1]; }else{ int min = Math.min(dp[i-1][j],dp[i][j-1]); dp[i][j] = Math.min(dp[i-1][j-1],min) + 1; } } } return dp[row][col]; } public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str1 = sc.nextLine(); String str2 = sc.nextLine(); int result = distancefun(str1,str2); System.out.println(result); } }
星际密码
//找规律! 当n = 1时 |1 1| 左上角值 = 1 |1 0| 当n = 2时 |1 1|*|1 1|=|2 1| 左上角值 = 2 |1 0| |1 0| |1 1| 当n = 3时 |2 1|*|1 1|=|3 2| 左上角值 = 3 |1 1| |1 0| |2 1| 当n = 4时 |3 2|*|1 1|=|5 3| 左上角值 = 5 |2 1| |1 0| |3 2| 当n = 5时 |5 3|*|1 1|=|8 5| 左上角值 = 8 |3 2| |1 0| |5 3| 当n = 6时 左上角值 = 13 ? //可以知道 这是一组斐波那契数列!
import java.util.*; public class Main{ public static void main(String[] args){ int[] arr = new int[10001];//我们只需要把 前10000 个斐波那契值保存即可!而这里大于4位就保留后四位,Int类型存储足够 arr[1] = 1; arr[2] = 2; for(int i = 3;i < 10001;i++){ arr[i] = arr[i - 1] + arr[i - 2]; arr[i] = arr[i] % 10000;//超过10000 对结果求余! } Scanner sc = new Scanner(System.in); while(sc.hasNext()){ StringBuffer sb = new StringBuffer(); int n = sc.nextInt(); for(int i = 0;i < n;i++){ int x = sc.nextInt(); sb.append(String.format("%04d",arr[x]));//格式打印保存到sb中! } System.out.println(sb);//打印sb! } } }