字符串变形词

变形词:
给定两个字符串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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值