package cglib;java
import java.util.Arrays;算法
public class StringNumber {
public static void main(String args[]) throws Exception{
String str0="123qw&()";
System.out.println("數組方法一:"+Array(str0));
String str1="qwerABC";
System.out.println("只有字母的位運算方法二:"+Bit(str1));
String str2="q123";
System.out.println("位運算方法三:"+Biter(str2));
String str4="qwqewwr@#¥123";
System.out.println("布爾運算方法四:"+Bool(str4));
String str5="125asd";
System.out.println("排序比較運算方法五:"+Sort(str5));
}
//時間複雜度爲O(n*n),空間複雜度爲O(1)
public static boolean Array(String str){
if(str==null||str==""){
return true;
}
else if(str.length()>256){
return false;
}
for(int i=0;i<str.length();i++){
for(int j=i+1;j<str.length();j++){
if(str.charAt(i)==str.charAt(j)){
return false;
}
}
}
return true;
}
public static boolean Bit(String str) throws Exception{
if(str==null||str==""){
return true;
}
else if(str.length()>26){
return false;
}
int checkchar = 0; //首先是26個0,也便是一個都沒有出現過
for(int i = 0; i < str.length(); i++)
{
if((str.charAt(i) < 'a' || str.charAt(i) > 'z')&&(str.charAt(i) < 'A' || str.charAt(i) > 'Z')) {
throw new Exception("字符串不符合要求");
}
int v = (int) str.charAt(i);
//咱們判斷checkchar中是否含有這個字符的位置
int b=checkchar&(1 << v);
if (b!=0){//判斷,若是是1&1的話,結果就是1,就是存在重複
return false;
}
checkchar|=(1 << v); //把這個位置設置爲1
}
return true;
}
/**
* 經過位運算來減小空間的使用量。
* 用每一位表徵相應位置字符的出現。
* 對於ASCII字符,咱們須要256位,即一個大小爲8的int 數組a便可。
* 這裏的關鍵是要把字符對應的數字,映射到正確的位上去。
* 好比字符'b'對應的 代碼是98.
* 用98除以32,獲得對應數組a的下標:3。
* 98對32取模獲得相應的位:2。
* 該算法的時間複雜度爲O(n),須要的內存空間更小
*
*/
public static boolean Biter(String str){
if(str==null||str==""){
return true;
}
else if(str.length()>256){
return false;
}
final int[] a = new int[8];//位運算時,256個字符須要8個整型數來表徵存儲位:256/32=8
for (int i=0;i<str.length();++i) {
int v = (int) str.charAt(i);
int idx=v/32,shift=v%32;
int b=a[idx]&(1 << shift);
if (b!=0){
return false;
}
a[idx]|=(1 << shift);
}
return true;
}
public static boolean Bool(String str){
if(str==null||str==""){
return true;
}
else if(str.length()>256){
return false;
}
boolean[] bole=new boolean[256];//默認都爲false
for(int i=0;i<str.length();++i){
int a=(int)str.charAt(i);
System.out.println(str.charAt(i));
System.out.println("a="+a);
if(bole[a]==true){//若是a對應的數組裏面是true,說明已經存在,參考用map判斷存在值的邏輯
return false;
}
bole[a]=true;//至關於該值已經判斷了,作存在一次的標識。回頭再碰到相同的值,至關於索引一致,則數組裏面的值是固定的
}
return true;
}
public static boolean Sort(String str){
if(str==null||str==""){
return true;
}
else if(str.length()>26){
return false;
}
char[] character =new char[str.length()];
for(int i=0;i<str.length();i++){
character[i]=str.charAt(i);
}
Arrays.sort(character);
for (int i = 0; i < character.length - 1; i++) {
if (character[i] == character[i + 1]) {
return false;
}
}
return true;
}
}
數組
輸出:排序
數組方法一:true
只有字母的位運算方法二:true
位運算方法三:true
q
a=113
w
a=119
q
a=113
布爾運算方法四:false
排序比較運算方法五:true索引