Java思维题
1、求取字符串中出现的第一个非重复字符。
比如: "hello" 中的 h, "hello, how r you?" 中的 e
2、使用26字符母实现加密
比如: StringUtil 加密后的结果为 FgevatHgvy,Hello 加密的结果为 Uryyb
3、翻转一个字符串
比如:“你好啊!” 翻转成 "!啊好你"
4、检查一个字符串是否为空(包括 null 的判断)
实现方法(个人想法):
第一题
//第一种实现方式 public String getIsStr(String str){ String[] arr = str.replaceAll("\\s","").split(""); for (int i = 0; i <arr.length ; i++) { if( str.lastIndexOf(arr[i]) == str.indexOf(arr[i]) ){ return arr[i].toString(); } } return ""; } //第二种实现方式 String str ="hello, how r you?"; String liststr = str.replaceAll("[^a-zA-Z]",""); String[] listarr = str.split(""); for (int i = 0; i <listarr.length ; i++) { boolean flag = true; for (int j = i+1 ;j<listarr.length ;j++){ if(listarr[i].equals(listarr[j])){ flag = false; continue; } } if (flag){ System.out.println(listarr[i]); break; } } //第三种实现方式 public char find(String str){ //存放重复的数据集合 HashSet<Character> data = new HashSet<>(); //存放不重复的数据集合 List<Character> data1 = new ArrayList<>(); for (int i = 0; i <str.length() ; i++) { //将 目标字符串 分割成 字符 char c = str.charAt(i); //如果集合data中存在这个目标内容,跳出 if(data.contains(c)){ continue; } //如果集合 data1 中 已经存在此目标内容,进行 移除 向 data集合中添加数值,否则继续向data1集合中添加 if(data1.contains(c)){ data1.remove((Character) c); data.add(c); }else{ data1.add(c); } } if(data1.size() >0 ){ return data1.get(0); }else{ return 0; } }
第二题
public String rotate(String str){ // 接收结果的变量 String result =""; //"a","b","c","d","e","f","g","h","i","j","k","l","m" //"n","o","p","q","r","s","t","u","v","w","x","y","z" //大小写字符数组 String [] lower = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; String [] upper = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}; //将 目标字符串 去掉 里面一些符号 并且 分割 String [] arr = str.replaceAll("\\s","").split(""); for (int i = 0; i <arr.length ; i++) { //将目标值都跟 小写字符数组 对一遍 当目标值等于 lower里 相对应的值时, 使用一个小算法 for (int j = 0 ; j < lower.length; j++) { if( arr[i].equals(lower[j]) ){ // 比如 当 目标值 是 a 那么通过计算 得到将是 lower数组的 u result +=lower[(j + 13)%26]; } } //将目标值都跟 大写字符数组 对一遍 当目标值等于 upper里 相对应的值时, 使用一个小算法 for (int k = 0; k <upper.length ; k++) { if( arr[i].equals(upper[k]) ){ // 比如 当 目标值 是 A 那么通过计算 得到将是 lower数组的 U result +=upper[(k + 13)%26]; } } } return result; } //第二种方式 public String rotate1(String str){ String result = ""; String [] arr = str.split(""); for(int i =0 ;i<arr.length; i++){ //将数组里值转成ASCII码 65 - 90 大写26字母 97 - 122 小写字母 if( arr[i].hashCode() >=65 && arr[i].hashCode()<=90 ){ int index1 = arr[i].hashCode(); if(index1 <= 78){ result += (char)(index1 + 13 ); }else{ result += (char)(index1 - 13 ); } //65 = A = N = 78 // 65 + 13 =78 }else if( arr[i].hashCode() >=97 && arr[i].hashCode() <=122 ){ int index1 = arr[i].hashCode(); if(index1 <= 110 ){ result += (char)(index1 + 13 ); }else{ result += (char)(index1 - 13 ); } }else{ result +=arr[i]; } } return result; }
第三题
//第一种方式 public String reverse(String str){ //将字符 分割成 字符数组 String [] arr = str.split(""); //获取 字符数组的长度 int size = arr.length; //拿一个结果变量来接收 String result = ""; //循环 for (int i = 0; i <arr.length ; i++) { // 倒取 数组的值 赋予 结果变量 result += arr[ --size]; } return result; } //第二种方式 public String reverse1(String str){ StringBuilder result =new StringBuilder(str); return result.reverse().toString(); }
第四题
public boolean isEmpty(String str){ //字符串对象和字符串变量这两个概念的区别 //字符串变量保存一个字符串对象的引用 //判断字符串是否空涉及两个层次 //1、首先判断字符串变量的引用是否为空,即空对象的概念,用null来判断,可以用== null;(注意不能用equals(null),在参数为null情况下,返回值永远是false) //2、是在不为空对象的情况下,在判断字符串对象是否为空串,即长度为0.用length()==0 if(!( str == null ||str.length() == 0)){ return true; } return false; }