广州细刻面试记录

虽然这家公司不是什么BAT大厂,估计也没有什么人会看到这篇文章,但是作为一个梦想着进Bat的渣渣,怎么能不对自己每次面试进行总结呢?
回顾今天的面试,其实整体感觉还Ok的,结合着简历的项目经验问,但是问题就是自己笔试太水了,两道和算法沾边的,自己一道题都没做出来(找个借口,下大雨淋傻了,还有做笔试的时候旁边太吵了)。

有一说一还是自己算法太水,平时几乎不关注这些东西,经历都在中间件上面,跟一些中间件的源码,说到底还是自己太水,大学那几年没认真花功夫在编程上,大学的学习只是为了应付期末考。环境很重要,如果可以重来,我应该高三复读一年,考个好点的学校,而不是随便上一个二本。最近也是无数次梦到自己在高考,高考已然成了我心里面的一个解不开的结。但是那又怎样呢?都说“种一棵树最好的时间是从前,其次是现在”。那么就从现在认真打基础,争取能实现自己心中的梦想。

第一道题

给了一个数列an = an-1 +an-2 ,求第n个元素是多少,其实也就是数列问题
原题是这样的:
存在一列数: 1 1 2 3 5 8 13… 求第四十位是多少,要求用递归的思想。
下面是我的解法,当时脑子秀逗了,在纸上怎么都写不出来…

public class ResuiveSum {

	private static int i = 0;

	private static int doSum(int pre, int next, int indexOf) {

		// 处理边界值 第一位元素是几
		if (indexOf == 1) {
			return pre;
		}

		// 处理边界值 第二位元素是几
		if (indexOf == 2) {
			return next;
		}

		// 请第N位的元素是几,需要加N-2次 例如,求第三位是几 那么就是1+1 一共做了1次加运算
		if (i == indexOf-2) {
			return next;
		}

		int temp = pre;
		pre = next;
		next = temp + next;

		i++;

		return doSum(pre, next, indexOf);
	}

	public static void main(String[] args) {
		int i = doSum(1, 1, 40);
		System.out.println(i); // 102334155
	}

}

第二道题

有这样一个数组 1,0,3,12,0,5 让你把0都排在数组的最后面,且保持其余的元素相对有序 示例:{1,0,3,12,0,5} 变为{1,3,5,12,0,0}

  • 要求不能使用数组copy
  • 要求操作次数最少
    我的答案本体操作是2次,但是我不能保证我的算法实现是正确的,我目前的思路就是先遍历一遍把0都搞到数组后面去,然后对非零部分进行冒泡排序。
public class MinSum {
	// 有一个这样的数组,需要把0都移到数组最后面,且保持其余的元素相对有序
	// 要求不能使用数组copy
	// 要求操作次数最少
	// 示例:{1,0,3,12,0,5} 变为{1,3,5,12,0,0}

	// 全局交换次数
	static int count = 0;

	public static void main(String[] args) {

		int[] array = {1,0,3,12,0,5};
//		int[] array = {0,222,1,0,3,12,0,5,0};
		System.out.println(Arrays.toString(sort(array)));
		System.out.println("交换次数:"+count); 
	}


	public static int[] sort(int[] array) {

		// 标记,假定最后一个元素不为0
		int noneZero = array.length-1;

		for(int i=0;i<=noneZero;i++) {
			if (array[i] == 0) {
				// 从后往前找第一个非0的元素,找到了就把他们交换(包含自身)
				for (int j=noneZero;j>=i;j--) {
					// 如果不等于0,则交换,但是自己跟自己不交换
					if (array[j]!=0 && array[i]!=array[j]) {
						array[i] =array[j];
						array[j] = 0;
						count++;
						break;
					} else {
						noneZero--;
					}
				}
			}
		}

		// 到这里,为0 的元素全部去到了数组尾部,在对前半部分进行冒泡排序的
		System.out.println(Arrays.toString(array));
		System.out.println("最后一个不为0元素的索引"+noneZero);
		for(int m=0;m<noneZero;m++) {
			for (int n=m+1;n<noneZero+1;n++) {
				// 如果前面的大于后面的 则进行交换
				if (array[m]>array[n]) {
					int temp = array[m];
					array[m] = array[n];
					array[n] = temp;
					count++;
				}
			}
		}
		return array;
	}

}

总体来说题目还是很简单,第一道题我回来后在电脑上五分钟就写出来了,第二道题还是做了有一会。(嗨,还是菜啊)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值