几个基础程序设计题目

笔试中的一些题目,碰到了几次,写的算法都还有待优化,优化过后的一部分记录如下:

1.翻转字符串:如输入i am a student.处理后为student. a am i
思路一:可以直接用split()函数然后将数组逆向输出,不过既然是笔试应该不是考查api,所以还是老老实实的写算法吧。之前写的是逐个字符读取,将字符逐一放到以字符串中,当读到空格则将字符串放入一个数组,将字符串清空并重新将字符加入字符串……循环完后由于字符串最后没有空格则直接将最后的串加入……

public class ReverseSentence
{
static char[] c="i am a student.".toCharArray();

public static void main(String[] args)
{
List list=new ArrayList();
String temp="";
for(int i=0;i<c.length;i++)
{
if(c[i]!=' ')
temp+=c[i];//将不为空的字符加入字符串
else
{
list.add(temp);//将拆分出的单词加入列表
temp="";
}
}
list.add(temp);//加入最后一个单词
String r="";
for(int j=list.size()-1;j>=0;j--)
{
r+=list.get(j)+" ";
}
System.out.println(r);
}

}


现在想着都汗~这种代码都能写出来……
思路二:下面是优化过的代码,是采取先所有逆序 然后再以空格为界再对每个单词逆序
public class ReverseSentence
{
static char[] c="i am a student.".toCharArray();

public static void reverse(char[] c,int begin,int end)
{
char temp;
while(begin<end)
{
temp=c[begin];
c[begin]=c[end];
c[end]=temp;
begin++;
end--;
}
}

public static void main(String[] args)
{
int begin,end;
int len=c.length-1;
reverse(c,0,len);//将整个句子逆序
while(end<=len)
{
if(c[i]!=' ')
end++;
else
{
reverse(c,begin,end-1);//将空格以前的单词逆序
end++;
begin=end;//从下个单词处继续开始
}
}
System.out.println(c);
}
}



2.逆序输出整数1658738
这个题目当时的算法也很差劲,后来发觉可以这样写:

public int reverseInteger(int n)
{
int sum=0;
while(n!=0)
{
sum=sum*10+n%10;
n=n/10;
}
return sum;
}

这样很简洁,每次取出一位,将之前的结果扩大十倍在一直求和!

3.将两个递增的数组合并且按由小到大排序
这个题目直接就想到了数据结构中将两个有序链表合并那部分,java中没有指针就用数组下标了
      static int[] a = { 1, 2, 3, 5, 7, 9 };
static int[] b = { 2, 3, 4, 6, 8 };

public static List mergeSort(int[] a, int[] b) {
List list = new ArrayList();
int index = 0;
int i, j;
for (i = 0, j = 0; i < a.length && j < b.length;) {
if (a[i] == b[j]) {//相等的话则加入并且下标都加1
list.add(a[i]);
i++;
j++;
} else {
if (a[i] > b[j]) {
list.add(b[j]);//元素较小的数组小标加1
j++;
} else {
list.add(a[i]);//元素较小的数组小标加1
i++;
}
}
}
while (i < a.length) {//将剩下的元素加入
list.add(a[i]);
i++;
}
while (j < b.length) {
list.add(b[j]);
j++;
}
return list;
}

这个是求并集的算法,稍作修改就可以得到求交集的算法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值