一些常见的字符串和数组的题

1.字符串转化(压缩)“aaabbccd"->“a3b2c2d1”
分析:从0号下标开始查起,统计连续字符的个数,比较当前字符和前一个字符,若当前字符和前一个字符相等,个数清零,count++,然后将字符和count进行拼接即可。

import java.util.Scanner;
public class Compress {

    public static String stringCompress(String str){
        StringBuilder S=new StringBuilder();
        char n1=str.charAt(0);  //索引从0开始
        int count=1;    //连续的个数统计
        for(int i=1;i<str.length();i++){  //从一号开始遍历
            char n2= str.charAt(i);
            if(n1==n2) {
                count++;
                continue;
            }
           S.append(n1).append(count);   //拼接字符
            n1=n2;
            count=1;   //若当前字符和前一个字符相等,个数清零,到新的字符
            }

        return  S.append(n1).append(count).toString();  //最后大于长度的最后一个还要在拼接一次

    }
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入要压缩的字符串:");
        String str=scan.nextLine();
        stringCompress(str);
        System.out.println(stringCompress(str));
    }
}

2.统计字符串中数字个数
分析:从0号下边开始循环,若是数字则计数加1.

import java.util.Scanner;

public class Numeric {
    public static int isNumeric(String str) {
        int count=0;
        for(int i=0;i<str.length();i++){
            char n= str.charAt(i);
            if('1'<n&&n<'9'){
                count++;
                continue;
            }
        }

        return count;

    }
        public static void main(String[] args){
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入要统计的字符串:");
            String str=scan.nextLine();
            System.out.println(isNumeric(str));
    }
}

3.数组逆置,即将i am a girl 逆置为:girl a am i.
方法一:分析,先定义一个交换字符的方法,然后在逆置函数中调用。首先引入toCharArray()方法,将字符串化为字符数组。
第一步:逆置整个数组
第二步:每个词由空格隔开,因此在整个数组逆置后再将每个词的各个单词逆置。

import java.util.Scanner;

public class Reverse {
    public static void Swap(char[] a,int b,int c){
        char t;  //引入中间变量
        for(;b<c;b++,c--){
            t=a[b];
            a[b]=a[c];
            a[c]=t;
        }
    }
    public static String reverseSentence(String str) {
        char[] c=str.toCharArray();    //将字符串转化为字符数组
        Swap(c,0,c.length-1);    //逆置整个数组
        int start=0;
        for(int i=1;i<c.length;i++){
            if(c[i]==' '){
                Swap(c,start,i-1);
                start=i+1;
            }
        }
        Swap(c,start,c.length-1);
        return String.valueOf(c);

        }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要逆置的字符串:");
        String str = scan.nextLine();
        System.out.println(reverseSentence(str));
    }
}

方法二:引入栈,栈是先进后出,因此可以先入栈然后出栈即可

import java.util.Scanner;
import java.util.Stack;

public class Reverse2 {

    public static String reverseSentence(String str) {
        String[] split = str.split(" ");  //通过空格分割
        int len = split.length;
        StringBuffer stringbuffer = new StringBuffer();
        Stack<String> stack = new Stack<>();  //创建栈对象
        for (int i = 0; i < len; i++) {
            stack.push(split[i]);  //入栈
        }
        for (int i = 0; i < len; i++) {
            String pop = stack.pop();  //出栈
            stringbuffer = stringbuffer.append(pop + " ");
        }
        String s = stringbuffer.toString();
        return s;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入要逆置的字符串:");
        String str = scan.nextLine();
        System.out.println(reverseSentence(str));
    }
}


4.将一个数组从左开始第几位之前进行旋转:左旋数组
分析:假设数组为abcdef 第二位之前
第一步:引入逆置函数,将字符串转化为字符数组,进行交换,然后再将字符数组转换成字符串返回。
第二步:在方法体内:先逆置旋转前面部分的字符串,结果为:bacdef
再逆置旋转后面部分的字符串,结果为:bafedc
最后逆置整体,结果为:cdefab


import java.util.Scanner;

public class Rotate {
    public static String reverse(String str,int first,int last) {
        char[] c = str.toCharArray();    //将字符串转化为字符数组
        char t;
        for (; first < last; first++, last--) {
            t = c[first];
            c[first] = c[last];
            c[last] = t;
        }
        return String.copyValueOf(c);   //将字符数组转换成字符串
    }
    public static String leftRotateString(String str,int n){
        if(str!=null&&n<str.length()) {
            int left1 = 0;
            int right1 = n - 1;
            int left2 = n;
            int right2 = str.length() - 1;
            str = reverse(str, left1, right1);//先逆置旋转前面部分的字符串
            str = reverse(str, left2, right2);//再逆置旋转后面部分的字符串
            str = reverse(str, left1, right2);  //最后逆置整体
        }
        return str;
    }

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入要旋转的字符串:");
        String str=scan.nextLine();
        System.out.println(leftRotateString(str,2));
    }

}


5.实现把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素

import java.util.Scanner;

/*实现把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

 */
public class Xuan {
    public static int order(int[] a,int left,int right ){   //顺序查找
        int min=a[left];
        for(int i=left+1;i<=right;i++){
            if(a[i]<a[left]){
                min=a[i];
            }
        }
        return min;
    }
    public static int minNumberRotate(int[] a){
        if(a.length==0){
            return -1;
        }
        int left=00;
        int right=a.length-1;
        int mid=left;
        while(a[left]>=a[right]){
            if(right-left==1){  //如果此时数组只剩下两个数值
                mid=right;    //最小的即为右边的值
                break;
            }
            mid=(left+right)/2;   //在数组的长度是两个以上的情况下
            if(a[left]==a[mid]&&a[left]==a[right]){
                return order(a,left,right);   //都相等,进行顺序查找
            }
            if(a[mid]>=a[left]){    //最小值在后半部分
                left=mid;
            }
            else if(a[mid]<=a[left]){
                right=mid;
            }
        }
        return a[mid];
    }

    public static void main(String[] args) {
        Xuan x=new Xuan();
        int[] a={3,6,9,1,2};
        System.out.println(x.minNumberRotate(a));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值