变形词:
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1和str2互为变形词。
HashMap 解法:
HashMap的主要方法
int size() :得到Map中“键-值对”的数量
boolean isEmpty() :Map是否是空的,也就是是否不含有任何“键-值对”
boolean containsKey(Object key) :Map中是否含有以key为键的“键-值对”
boolean containsValue(Object value) :Map中是否含有以 value 为值的“键-值对”
Object get(Object key) :从Map中得到以key为键的值,如果Map中不含有以key为键的“键-值对”则返回null
Object put(Object key, Object value) :向Map中存储以key为键、value为值的“键-值对”
Object remove(Object key) :从Map中移除以key为键的“键-值对”
void putAll(Map t) :将另一个Map中的所有“键-值对”导入到此Map中
void clear() :清除所有“键-值对”
Set keySet() :得到所有的键
Collection values() :得到所有的值
Set entrySet() :得到所有的“键-值对”,Set中的类型是Map.Entry
原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
初始化HashMap<Character,Integer> s=new HashMap<Character,Integer>();
import java.util.HashMap;
public class Trr {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(isdeformation("1123","1213"));
}
public static boolean isdeformation(String s1,String s2) {
HashMap<Character,Integer> s=new HashMap<Character,Integer>();
char []chas1=s1.toCharArray();
char []chas2=s2.toCharArray();
for(int i=0;i<s1.length();i++) {
if(!s.containsKey(chas1[i]))
s.put(chas1[i], 1);
else {
int m=(Integer)s.get(chas1[i]);
s.put(chas1[i], m+1);
}
}
for(int j=0;j<s2.length();j++) {
if(!s.containsKey(chas2[j])) {
return false;
}else {
int m=(Integer)s.get(chas2[j]);
if(m-1<0) return false;
s.put(chas2[j], m-1);
}
}
return true;
}
}
数组解法
此题的两个字符串种类和次数都一样,只有顺序不一样,那么可以使用一个数组记录第一个字符串每个字母的出现频率次数,这样在第二个字符串中遍历每个字符,从数组中挨个减去,如果数组最后为空了,说明两个字符互为变形词。
对于数组的选择,可以利用字符的ASCII码值,字符可以直接和整型进行算术运算,字符串则不可以 ,例如:
‘a’+0 = 97;“a”+0 = a0;字符的编码值出现在0~255之间,我们开辟一个266空间的整型数组map,每个字符的ASCII值对应数组的下标,例如a是97,b是98,map[97] = 3,说明a出现了3次。
public class Deformation {
public static void main(String[] args){
String a = "123444";
String b = "344421";
System.out.println(isDeformation(a,b));
}
public static boolean isDeformation(String a, String b){
char[] chas1 = a.toCharArray();
char[] chas2 = b.toCharArray();
int[] map = new int[256];
if(chas1.length!=chas2.length){
return false;
}
for(int i=0;i<chas1.length;i++){
map[chas1[i]]++;
}
for(int i=0;i<chas2.length;i++){
if(map[chas2[i]]--==0){
return false;
}
}
return true;
}
算法时间复杂度:o(n)
算法空间复杂度:字符种类个数
int a='你';
System.out.println(a); 20320 为了防止这种使用HashMap.
进制
二进制:采用0和1两个数码来表示的数。进位规则是“逢二进一”
八进制:采用0-7八个数字计数,进位规则是“逢八进一”
十进制:采用0-9十个数字计数,进位规则是“逢十进一”
十六进制:采用0-9,A-F(10-15),进位规则是“逢十六进一”
/**
* 进制转换
*/
public class jinzhiTest {
public static void main(String[] args) {
int i = 22;
//二进制 10110 = 1*2^4+0*2^3+1*2^2+1*2^1+0*2^0=22
System.out.println(Integer.toBinaryString(i)); //10110
//八进制 26 = 2*8^1+6*8^0 = 22
System.out.println(Integer.toOctalString(i)); //26
//十六进制 16 = 1*16^1+6*16^0 = 22
System.out.println(Integer.toHexString(i)); //16
}
}
字符:是各种文字和符号的总称,包括各个国家的文字、标点符号、图形符号、数字等。
字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。
字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多少个字节表示等问题,则是由编码来决定的。计算机要准确的处理各个字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。(通过字符编码可以把字符转化成字节)
二、常见的字符集编码介绍
1、ASCII字符集
1.1、定义
ASCII 字符集:美国信息互换标准代码。是基于罗马字母表的一套电脑编码系统,主要显示英语和一些西欧语言,是现今最通用的单字节编码系统。ASCII字符集只有256个字符,用0-255之间的数字来表示。(使用7位单元的字符集01111111–>256)
1.2、包含内容
控制字符(回车键、退格、换行键等)
可显示字符(英文大小写、阿拉伯数字、西文符号)
扩展字符集(表格符号、计算符号、希腊字符、拉丁符号)
1.3、编码方式
第0-31号及127号是控制字符或通讯专用字符
第32-126号是字符,其中48-57号是0-9是个阿拉伯数字,65-90号为26个大写英文字母,97-122号为26个英文小写字母,其余一些为标点符号,运算符号等。
其他编码参见 : https://blog.csdn.net/xiaoxianer321/article/details/61617622