问题描述:
1. 问题涉及知识点.
string.contains(key)
和string.substring()
使用.
2. 自己解法.
- 我是按照字符串的思路解决的.
StringBuilder
新建一个sb,每次使用string.contains
判断是不是包含,不包含使用StringBuilder.add
添加进去.
package com.chaoxiong.niuke.huawei;
import java.util.Scanner;
/**
* Create by tianchaoxiong on 18-4-9.
*/
public class HuaWei_9_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int key = scanner.nextInt();
System.out.println(Convert(key));
}
}
private static String Convert(int key) {
String strKey = key+"";
StringBuilder sb = new StringBuilder("");
for(int i=0;i<strKey.length();i++){
char tmpChar = strKey.charAt(strKey.length()-1-i);
if(!sb.toString().contains(tmpChar+"")) {
sb.append(tmpChar);
}
}
return sb.toString();
}
}
3. 优质答案.
解法一: 使用标记数组.
- 使用一个十位的数组作为标志保存出现过的字符.
- 每次使用ascii减去48,直接把char转为int.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String s=scanner.nextLine();
int len=s.length();
int []arr1=new int[10];//标志数组
for(int i=len-1;i>=0;i--){
if(arr1[s.charAt(i)-48]==0){
System.out.print(s.charAt(i)-48);//直接打印
arr1[s.charAt(i)-48]++;//标记出现过的字符.
}
}
}
}
}
解法2:使用arrayList
每次通过list.contarins
来判断是否包含.
此处应该注意的是HashSet
输出顺序时候Hash算法决定,不能保证和你输入的顺序一直,所以不能用.
package com.chaoxiong.niuke.huawei;
import java.util.*;
/**
* Create by tianchaoxiong on 18-4-9.
*/
public class HuaWei_9_3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int key = scanner.nextInt();
Convert(key);
}
}
private static void Convert(int key) {
String string = String.valueOf(key);
List<Character>charList = new ArrayList<Character>();
int N = string.length();
for(int i=0;i<N;i++){
char tmp = string.charAt(N-1-i);
if(!charList.contains(tmp))
charList.add(tmp);
}
for (char each:charList){
System.out.print(each);
}
}
}
4. 本题总结.
这个题给我的感悟是:
- 根据题意,不需要打印的地方就不进行打印.简化操作.