对数据结构:char的理解,以及算法题中String的处理

1、赋值

char是16位的,采取的Unicode的编码方式,所以char就有以下的初始化方式:

  • char c=‘c’; //字符,可以是汉字,因为是Unicode编码。需要加单引号。
  • char c=十进制数,八进制数,十六进制数都可以; //可以用整数赋值【整数范围:0~65535】。输出字符编码表中对应的字符
  • char c=‘\u数字’; //用字符的编码值来初始化,如:char=‘\0’,表示结束符,它的ascll码是0,这句话的意思和 char c=0 是一个意思。
    例如:char a = 65; char a1 = ‘A’; 两者打印输出都是A

2、运算

char类型是可以运算的因为char在ASCII等字符编码表中有对应的数值。
在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。==(char遇到运算符,就会自己转为ASCII做运算)==在中缀转后缀表达式算法中经常就有char的运算。

  • 例子:
    char a = 65; -->A //为char类型变量 a 赋值常量值 65。
    char b = ‘A’+3; -->D // 65+3=68,ASCII对应的字符为 D【注意:这里查询的是十进制编码的ASCII字符集】 ‘a’ + 3 结果是常量
    char c = a+3; -->报错 //无法从int类型转换为char类型。a+3 结果是int类型的变量!
    int d = ‘a’; //输出变量d后结果是97;

接下来让我们了解下为什么会不能这样运算:
首先,我们先知道在jvm内存机制中,char类型数据运算是将字符在ASCII表对应的整数以int类型参与运算(可以认为’ A’=65)
常量(65)与常量(3)运算得到一个新的常量(68),常量赋值给变量(b),不存在强制转换,只要这个接受变量(b)的类型范围大于这个常量即可。
而变量声明时需要定义数据类型(例:char a),内存就为这个变量划分一个char类型大小的空间,其中变量(a)的值是可变的,而常量(3)的值是不变的,两个运算得到的还是一个变量,本例中(a+3)是int类型的变量,而int类型变量(a+3)赋值给char类型变量(c)需要强制转换,因此会报错。
char c=(char)(a+3); -->D

3、算法题中对String数据的操作

在算法题中经常遇到String s = “xxxx”,我们往往需要对s中的每一个字字符串进行处理,单独进行操作肯定不行,java不像c++操作起来那么简单。不可以直接s[i]的方式取到单独的元素。

3.1 思路1、使用toCharArray()方法

String s = "ASDFGH";
//System.out.println(s[2]);错误写法
char[] chars = s.toCharArray();
System.out.println(chars[2]); //D
System.out.println(chars[0]+1); //66  char遇到运算符,以对应的asc2的int值进行运算

另外注意联想到,String类型数据,遇到 + 运算符直接将其他类型数据变为字符串类型

  • 例:String s = “23456”,如何以int类型取出每一个数字?
 String s1 = "1234";
 char[] chars1 = s1.toCharArray();
   for (int i = 0; i < chars1.length; i++) {
       int num = chars1[i];//49,50,51... 想得到1,2..减去48
       int realNum = chars1[i] - '0';//1,2,3,4...
       char c1 = chars1[i];//1,2,3,4(都还是char类型)
   }

3.2 例题:将字符串倒叙输出

思路:字符串直接操作每一个元素肯定是不好做的,思路就是要转为数组,对每个元素进行操作!
使用toCharArray(),转为char数组,之后使用双指针法(复习倒置链表的双指针解决方案),将头尾进行倒置!最后通过String的构造函数,将数组重新组装为String。

public static String reverseString(String originalString){
    char[] charArray = originalString.toCharArray();
    //双指针
    int left = 0;
    int right = charArray.length -1;
    while(left < right){
        char temp = charArray[left];
        charArray[left] = charArray[right];
        charArray[right] = temp;
        left++;
        right--;
    }
    return new String(charArray);
}

3.3 例题:反转字符串中的单词

输入:s = “the sky is blue”
输出:“blue is sky the”

//API大法,使用库函数
public String reverseWords(String s) {
    //trim修剪的意思,先去除字符串两边的多余空格
    s = s.trim();
    //将每个单词分离出来(正则表达式 spacce /s+)
    //注意split之后是一个数组,但是数组不好操作,所以使用Arrays封装类
    List<String> arrList = Arrays.asList(s.split("\\s+"));
    //每个单词倒了一个位置
    Collections.reverse(arrList);
    //单词间用空格隔开
    s = String.join(" ",arrList);
    return s;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值