一、获取最值
两种思路:记录最大值,或记录最大值的下标,具体代码:
public static int getmax1(int[] arr)
{
int x = arr[0];
for(int i=1;i<arr.length;i++)
{
if (arr[i]>arr[0])
{x=arr[i];}
}
return x;
}
public static int getmax2(int[] arr)
{
int x = 0;
for(int i=1;i<arr.length;i++)
{
if (arr[i]>arr[x])
{x=i;}
}
return arr[x];
}
注意从简单代码中体会复用和封装的优势。
*循环中变量用完即弃,则选择用for()
二、排序
1、选择排序 多次获取最大值,输出相当于下三角,便可使用嵌套循环的思想。
函数参数中获得的是实参,故不需要返回值。指针所指向位置并未变化,而所指向的内容可能发生变化。
2、冒泡排序 相邻元素的互相对比
注:提高效率的方法:尽量不在堆中进行操作,而在栈中进行操作,如在栈中记录脚标的位置。
static void bubblesort(int[] arr)
{
for(i=0;i<arr.length-1;i++)//排序的次数
{
for(j=0;j<arr.length-i-1,j++)//一趟排序,-1为防止越界;-i为比较长度递减
{
if(arr[j]>arr[j+1])//相邻元素的对比
{
swap(arr;j;j+1);
}
}
}
}
*复用性,在不同排序方法中都要用到数据互换,便可以封装成一个函数:static void swap(int[] arr ; int x ; int y)
三、折半查找
抓主要矛盾,循环用while(key!=arr[mid])
防止死循环:min和max 的加1或减1操作
跳出循环的条件:min>max
引申应用:给一个排好序的数组,找出一个元素在数组中插入的位置,返回mid即可。
四、进制转换
1、十to二
模2取整获取每个位的1或0信息
2、二to十六
思路:用移位(<<<,补0的移位)和与运算取每个16进制的位数,便得到该位的数值,再通过判断得到该位数的16进制具体数或字符。
以上可能用到字符串对象的reverse功能。
进阶:用查表方法,将二进制的数值和16进制的字符建立起对应关系,并通过索引找到对应的字符;通过判断num的数是否为0,决定是否需要继续右移取值;通过一个数组保存得到的16进制数;通过pos的值,确定从哪个位置开始打印。
代码:
public static void toHex(int num)
{
char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
char[] hex = new char[8];
int pos=hex.length-1;
while(num!=0)
{
int temp = num & 15;
//system.out.println(chs[temp]);
hex[pos--] = chs[temp];
num=num>>>4;
}
for(int x = pos+1,x<=hex.length;x++)//pos最后的自加操作;借用效应
{
system.out.prinln(hex[x]);
}
}
延展:扩展为多种进制可用的转换。
chs定义不变,和num与的基数变化,可得出如下定义形式:
public static void trans(int num; int base; int offset)
参数:需转换的数,需要与的数;右移的数;
然后再分别定义不同进制的转变,如
public static void toBin(int num)
{ trans(num,1,1)}
具体调用时按情况分别调用toBin即可。