算法第二次记录,首先是学习的双指针,分为左右指针和快慢指针,名称不同,用法也不同。
左右指针
左右指针是指双指针中一个指针在数组的最左侧,而另一个在最右侧。通过判断,可以分别让两侧的指针向中间移动,以求解问题。
快慢指针
快慢指针是指一个指针走的快,一个指针走得慢,类似龟兔赛跑。
简单介绍以下两个指针可以使用的案例
①左右指针:可以用来反转字符串
public class LeftRight {
public static void main(String[] args) {
char s[]={'H','G','F','E','D','C','B','A'};
int left = 0,right = s.length - 1;
char c;
while(left < right) {
c = s[left];
s[left] = s[right];
s[right] = c;
left++;right--;
}
for (int i = 0;i<s.length;i++){
System.out.print(s[i]+",");
}
}
}
②快慢指针:判断链表中是否存在环(这一部分还看不懂,等把链表也学完再回头看)public static boolean
hasCycle(ListNode head) {
ListNode slow = head;
if(slow == null) return false;
ListNode fast = head.next;
while(fast != null && fast.next != null){
if(slow == fast) return true;
slow = slow.next;
fast = fast.next.next;
}
return false;
}
C++的Java有相似的也有不一样的,在C++中,可以用结构体来实现一些算法操作,虽然Java里边没有,但是可以用类来实现,例如:
class Student{
private int grade = 0;
private String name ;
private String subject;
public Student(){
}
public Student(String name, String subject, int grade){
this.name = name;
this.subject = subject;
this.grade = grade;
}
public void setName(String name) {
this.name = name;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public String getSubject() {
return subject;
}
public int getGrade() {
return grade;
}
}
Student[] stu = new Student[10];
这样就可以建立一个类似于C++中结构体的数组。
// 传智专修学院的“Java程序设计”班有N(1≤100) 个学生,知道他们的个人信息和成绩:
//
// 姓名(长度不超过 20 的仅由小写字母组成的字符串)
// 平时分成绩(0 到 100 的整数)
// 期末考试成绩(0 到 100 的整数)
// 由于期末考试有点难,为了让分数没那么难看,将期末考试成绩进行调分,调分后的期末成绩是将其开根号(sqrt)后乘 10,然后向上取整。
//
// 最后这个同学的总评得分是 60% 的调分后期末考试成绩,加上 40% 的平时分成绩,四舍五入精确到整数。
//
// 请对这些同学的成绩进行排名。
import java.util.Scanner;
public class Text1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N = scanner.nextInt();
Student[] stu = new Student[N];
for (int i =0; i < stu.length ; i++){
String name = scanner.next();
int ordinary = scanner.nextInt();
double fina = scanner.nextInt();
stu[i] = new Student(name,ordinary,fina);
stu[i].setScore((int)Math.round(ordinary*0.4+Math.ceil(Math.sqrt(fina)*10)*0.6));
// String name = scanner.next();
// int ordinary = scanner.nextInt();
// int fina = scanner.nextInt();
//
// stu[i].setName(name);
// stu[i].setOrdinary(ordinary);
// stu[i].setFina(fina);
}
for (int i= 0;i<stu.length-1;i++){
for (int j=0;j<stu.length-1-i;j++){
if(stu[j].getScore()<stu[j+1].getScore()){
Student s =new Student(stu[j+1].getName(),stu[j+1].getScore());
stu[j+1]=stu[j];
stu[j]=s;
}
}
}
for (int i =0;i<stu.length;i++){
System.out.println(stu[i].getName()+" "+stu[i].getScore());
}
}
}
class Student{
private String name;
private int ordinary;
private double fina;
private int score;
public Student(){
}
public Student(String name,int ordinary,double fina){
this.name=name;
this.ordinary=ordinary;
this.fina=fina;
}
public Student(String name,int score){
this.name=name;
this.score=score;
}
public void setName(String name) {
this.name = name;
}
public void setOrdinary(int ordinary) {
this.ordinary = ordinary;
}
public void setFina(double fina) {
this.fina = fina;
}
public void setScore(int score){
this.score=score;
}
public String getName() {
return name;
}
public int getOrdinary() {
return ordinary;
}
public double getFina() {
return fina;
}
public int getScore(){
return score;
}
}
本周的结构体练习题1,在Java中也是可以实现C++的结构体的,就是相对来说稍微麻烦了点,做这道题了解到算法极其的严谨,稍微有一点点和要求不一样就会出现就算结果正确依旧不通过的结果。
本周就总结到这,学习任务任重而道远,加油加油加油。