笔试编程题

这篇博客涵盖了多种编程题目,包括数组排序(冒泡排序)、一维数组转置的两种方案、二维数组转置、数组查找(有序和无序)、寻找数组中两个元素之和等于给定值的特殊情况、字符串转置的两种方法、字符串到字符数组的转换、查找子字符串位置、替换指定字符、首字母大写以及统计特定字符出现次数。这些内容是面试中常见的编程题型。

编程题:
1.数组排序
冒泡排序:(main方法直接调用,传入数组)缺点时间复杂度为n*(n-1).

//冒泡排序
public static void bubbleSort(int arr []) {
	int temp=0;//临时存储变量
	for(int i=0;i<arr.length-1;i++) {//比较次数
		for(int j=0;j<arr.length-1;j++) {//交换次数
			if(arr[j]>arr[j+1]) {
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
}

2.一维数组转置
方案一:新建一个数组,反向循环取出给定数组元素,顺序存储在新建数组中,遍历即可。缺点:开辟了新的内存空间,占用资源。

//转置数组方案一
public static int[] reverseArray(int[] arr) {
	int[] temp=new int[arr.length];
	int foot=arr.length-1;//定义变量,赋值给定数组末尾元素
	for(int i=0;i<temp.length;i++) {
		temp[i]=arr[foot];
		foot--;//从数组下标后往前递减
	}
	return temp;
}

方案二:折半对换首尾元素,以中间元素索引为参考转换次数(更优)

//转置数组方案二
public static void reverseArrayTwo(int[] arr) {
	int center=arr.length/2;//转换次数
	int head=0;//头部开始索引
	int tail=arr.length-1;//尾部开始索引
	int temp=0;//临时存储数据
	for(int i=0;i<center;i++) {
	//交换头部,尾部索引元素。
		temp = arr[head];
		arr[head] = arr[tail];
		arr[tail] = temp; 
		head++;//头部索引从前往后递增
		tail--;//尾部索引从后往前递减
	}
	System.out.println();
	System.out.println("数组转置结果:");
	for(int k=0;k<arr.length;k++) {
		System.out.print(" "+arr[k]);
	}
}

3.二维数组转置

// 二维数组转置
public static void doubleArrayReverse(int[][] arr) {
	
	for (int i = 0; i < arr.length; i++) {//行数
		for (int j = i; j < arr.length; j++) {//以i=j为中间轴,列数对应行数位置
			if (i != j) {//如果列数和行数位置不对应,行和列的值对换
				int temp = arr[i][j];
				arr[i][j] = arr[j][i];
				arr[j][i] = temp;
			}
		}
	}
}

在这里插入图片描述
4.数组查找元素
4.1有序数组查找

 //二分查找/折半查找(数组有序)
public static int halfSearch(int[] arr,int from,int to,int key) {
	int mid =from+(to-from)/2; //计算中间点,关键点。from:头部开始索引,初始为0,to:尾部结束索引,初始为数组长度length,key :查找的元素。
	if(from<=to) {
		if(arr[mid]==key) {
			return mid;
		}else if(arr[mid]<key) {
			//查找元素key在右边,from修改为上一趟中间值右边一位,递归调用
			return halfSearch(arr, mid+1, to, key);
		}else if(arr[mid]>key){
			//查找元素key在左边,to修改为上一趟中间值的左边一位,递归调用
			return halfSearch(arr, from, mid-1, key);
		}else {
			//无此元素,返回-1,表示不存在。
			return -1;
		}
	}
	return 0;
}

4.2无序数组查找
先排序,再利用二分法(折半)查找。

5.数组中两个元素之和=给定元素
【特殊:数组中有0,并且存在两个及以上相同的数据,需要排除重复(即判断两数不分顺序以及相同数据出现4次及以上组合)】
如int[] a={0,1,2,2,4,5,6,7} 如给定元素7=3+4;将会出现3和4;4和3两组值,给定元素4=2+2;(数组中存在两个2)将会出现4次2,2的组合。这些情况是不允许出现的,需要判断后,仅输入一次组合

	//查找数组中两个元素之和=特定元素
public static void searchElement(int [] a,int key) {
	int m=0,n=0;//定义两个变量,用于接收数组中可能存在的两个数之和=key
	int count=0;//用于处理数组可能存在两个数之和=key,并且两数重复的次数。
	for(int j=0;j<a.length;j++) {
		int temp=key-a[j];//假设存在该变量,减去其中一个变量,检索差值是否存在于数组中
		for(int k=0;k<a.length;k++) {
			if(temp==a[k]) {//如果差值与数组中某一变量相等,则存在,赋值给m,n。
				n=a[k];
				m=a[j];
				if(m==n) {//记录重复的次数
					count++;
				}
				if(m<=n&&count<=1) {//满足两数不同(两数相加=key,必有一数<=另一数,故可用此关系防止出现两数互换顺序,导致重复)并且满足数组中重复且=key的值,保证重复次数小于等于1。
				System.out.println("两个数可以是:"+m+"和"+n);
				}
			};
		}
		if(m==0&&n==0) {
			System.out.println("该数组中不存在这样的两个数");
		}
		
	}
}

在这里插入图片描述
6.字符串转置
6.1stringBuffer转置 :reverse转换字符串。

public static String reverString(String str) {
	
	return new StringBuffer().append(str).reverse().toString();
}

6.2charAt()方法,进行字符串的拼接

//charAt字符串的拼接
public static void reverseStringCharAt(String str) {
	String s ="";
	for(int i=0;i<str.length();i++) {
		s = str.charAt(i)+s;//反向拼接
	}
	System.out.println("转置的结果:"+s);
} 

7.字符串转换为字符数组

// 字符串转为字符数组
public static void reverseStringToChar(String str) {
	char a[] = new char[str.length()];
	for (int i = 0; i < str.length(); i++) {
		a[i] = str.charAt(i);
	}
	for (int k = 0; k < a.length; k++) {
		System.out.print(" "+a[k]);
	}
}

8.查找子字符串的位置

public static int searchString(String str,String toStr) {
	return str.indexOf(toStr);
}

9.替换字符串中指定的字符

public static void replaceString(String str,String oldStr,String newStr) {
	System.out.println(str.replaceAll(oldStr,newStr));//字符串方法,第一个参数是要替换的字符,第二个参数是新的字符
}

10.实现字符串首字母大写

public static String changeStr(String str) {
	if(str==null || "".equals(str)) {//为null或者为空时,不作处理
		return str;
	}
	if(str.length()==1) {//只有一个字符时,直接转换
		return str.toUpperCase();
	}
	return str.substring(0, 1).toUpperCase()+str.substring(1);//截取0索引位置的字符,然后截取索引1之后的字符串,并进行拼接。
}

11.统计字符串中指定字符出现字数

public static void countString(String str,char a) {
	int count=0;
	char arr[]=str.toCharArray();//转换为字符数组
	for(int i=0;i<arr.length;i++) {
		if(arr[i]==a) {
			count++;
		}
	}
	System.out.println(a+"出现的次数为:"+count);
}

【延伸】统计字符串中指定的两个字符的次数

public static void countString(String str,char a,char b) {
	int[] count=new int[2];//分别存储两个字符统计次数
	char arr[]=str.toCharArray();//转化为字符数组
	for(int i=0;i<arr.length;i++) {
		if(arr[i]==a) {//第一个字符出现的次数
			count[0]++;
		}
		if(arr[i]==b) {//第二个字符出现的次数
			count[1]++;
		}
	}
	System.out.println(a+"出现的次数为:"+count[0]);
	System.out.println(b+"出现的次数为:"+count[1]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值