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

7757

被折叠的 条评论
为什么被折叠?



